如何将类转换成Dictionary <string,string>?
现在我再解释一下我对字典的渴望! 从我以前的问题回答这个问题是在我的脑海里出现!
现在的实际问题是我可以转换类字典?
在字典中,我希望我的类属性为KEY ,特定属性的值为VALUE
假设我的课是
public class Location { public string city { get; set; } public string state { get; set; } public string country { get; set; }
现在假设我的数据是
city = Delhi state = Delhi country = India
现在你可以轻松理解我的观点了!
我想做词典! 那个字典应该是这样的
Dictionary<string,string> dix = new Dictionary<string,string> (); dix.add("property_name", "property_value");
我可以得到的价值! 但是,我怎样才能得到属性名称( 不值 )?
我应该编码来创build它dynamic的! 这应该适用于我想要的每一个class级?
你可以理解这个问题
我怎样才能得到特定类的属性列表?
这是配方:1reflection,1 LINQ的对象!
someObject.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .ToDictionary(prop => prop.Name, prop => prop.GetValue(someObject, null))
自从我发表这个答案后,我检查了很多人认为它有用。 我邀请大家寻找这个简单的解决scheme来检查另一个问题,我把它推广到一个扩展方法: 映射对象到字典,反之亦然 。
这里有一个没有linqreflection的例子:
Location local = new Location(); local.city = "Lisbon"; local.country = "Portugal"; local.state = "None"; PropertyInfo[] infos = local.GetType().GetProperties(); Dictionary<string,string> dix = new Dictionary<string,string> (); foreach (PropertyInfo info in infos) { dix.Add(info.Name, info.GetValue(local, null).ToString()); } foreach (string key in dix.Keys) { Console.WriteLine("nameProperty: {0}; value: {1}", key, dix[key]); } Console.Read();
试试这个。
public static Dictionary<string, object> ObjectToDictionary(object obj) { Dictionary<string, object> ret = new Dictionary<string, object>(); foreach (PropertyInfo prop in obj.GetType().GetProperties()) { string propName = prop.Name; var val = obj.GetType().GetProperty(propName).GetValue(obj, null); if (val != null) { ret.Add(propName, val.ToString()); } else { ret.Add(propName, null); } } return ret; }
protected string getExamTimeBlock(object dataItem) { var dt = ((System.Collections.Specialized.StringDictionary)(dataItem)); if (SPContext.Current.Web.CurrencyLocaleID == 1033) return dt["en"]; else return dt["sv"]; }
我想使用JToken添加reflection的替代方法。 你将需要检查两者之间的基准差异,看看哪个有更好的performance。
var location = new Location() { City = "London" }; var locationToken = JToken.FromObject(location); var locationObject = locationObject.Value<JObject>(); var locationPropertyList = locationObject.Properties() .Select(x => new KeyValuePair<string, string>(x.Name, x.Value.ToString()));
注意这个方法对于平面类结构是最好的。