在C#中枚举对象的属性(string)
比方说,我有很多的对象,他们有很多string属性。
是否有一个编程方式来通过它们并输出属性名及其值?还是必须进行硬编码?
有没有可能是一种LINQ的方式来查询一个对象的属性types“string”,并输出它们?
你是否必须硬编码你想要回显的属性名称?
使用reflection。 它远不及硬编码的属性访问快,但它做你想要的。
以下查询为对象“myObject”中的每个stringtypes属性生成一个具有Name和Value属性的匿名types:
var stringPropertyNamesAndValues = myObject.GetType() .GetProperties() .Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null) .Select(pi => new { Name = pi.Name, Value = pi.GetGetMethod().Invoke(myObject, null) });
用法:
foreach (var pair in stringPropertyNamesAndValues) { Console.WriteLine("Name: {0}", pair.Name); Console.WriteLine("Value: {0}", pair.Value); }
您可以通过使用GetProperties
方法获取某个types的所有属性。 然后你可以使用LINQ Where
扩展方法过滤这个列表。 最后,您可以使用LINQ Select
扩展方法或像ToDictionary
这样的方便快捷方式来ToDictionary
。
如果你想限制枚举types为String
属性,你可以使用下面的代码:
IDictionary<String, String> = myObject.GetType() .GetProperties() .Where(p => p.CanRead && p.PropertyType == typeof(String)) .ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));
这将创build一个将属性名称映射到属性值的字典。 由于属性types被限制为String
因此将属性值转换为String
并且返回types为IDictionary<String, String>
。
如果你想要所有的属性,你可以这样做:
IDictionary<String, Object> = myObject.GetType() .GetProperties() .Where(p => p.CanRead) .ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
你可以使用reflection来做到这一点…。 在CodeGuru上有一篇很好的文章,但是这可能比你想要的要多…你可以从中学习,然后根据你的需要进行修改。
如果您的目标仅仅是使用人类可读格式输出存储在对象属性中的数据,则我更愿意将对象序列化为JSON格式。
using System.Web.Script.Serialization; //... string output = new JavaScriptSerializer().Serialize(myObject);
这样的事情呢?
public string Prop1 { get { return dic["Prop1"]; } set { dic["Prop1"] = value; } } public string Prop2 { get { return dic["Prop2"]; } set { dic["Prop2"] = value; } } private Dictionary<string, string> dic = new Dictionary<string, string>(); public IEnumerable<KeyValuePair<string, string>> AllProps { get { return dic.GetEnumerator(); } }