如何在C#中找到对象的所有公共字段?

我正在构建一个方法来接收一个ArrayList(可能是多个对象),然后列出ArrayList中每个对象的所有字段(及其值)。

目前我的代码如下:

public static void ListArrayListMembers(ArrayList list) { foreach (Object obj in list) { Type type = obj.GetType(); string field = type.GetFields().ToString(); Console.WriteLine(field); } } 

当然,我理解这段代码的直接问题:如果它有效,它只会在ArrayList中为每个对象打印一个字段。 我稍后会修复它 – 现在我只是好奇如何获得与对象关联的所有公共字段。

 foreach (Object obj in list) { Type type = obj.GetType(); foreach (var f in type.GetFields().Where(f => f.IsPublic)) { Console.WriteLine( String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj)); } } 

请注意,此代码需要.NET 3.5才能工作;-)

您可以使用BindingFlags获取在类中直接声明的所有对象Fields:

 GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) 

和所有对象字段包括inheritance:

 GetFields(BindingFlags.Public | BindingFlags.Instance) 
 public static void ListArrayListMembers(ArrayList list) { foreach (Object obj in list) { Type type = obj.GetType(); Console.WriteLine("{0} -- ", type.Name); Console.WriteLine(" Properties: "); foreach (PropertyInfo prop in type.GetProperties()) { Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, prop.Name, prop.GetValue(obj, null)); } Console.WriteLine(" Fields: "); foreach (FieldInfo field in type.GetFields()) { Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, field.Name, field.GetValue(obj)); } } } 

我想提一下,在字段中查找IsPublic不是必需的类型.GetFields()由MSDN定义:

返回值 – 类型:System.Reflection.FieldInfo []

一组FieldInfo对象,表示为当前Type定义的所有公共字段

当然,另一个问题是“为什么你有公共领域?” – 物业是可取的。 作为抽象,请注意reflection不是唯一的选择:类型也可以在运行时即时公开它的属性(就像无类型的DataTable / DataView如何将列作为属性公开)。

为了支持这一点(同时也支持简单对象),您将使用TypeDescriptor

  foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj)) { Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj)); } 

这也允许多种可扩展性选项 – 例如,大大加快reflection速度 (不改变任何代码)。

  static void ListArrayListMembers(ArrayList list) { foreach (object obj in list) { Type type = obj.GetType(); foreach (FieldInfo field in type.GetFields(BindingFlags.Public)) { Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString()); } } }