2008-10-26 81 views
13

我正在构建一个方法来接受一个ArrayList(可能充满了对象),然后列出ArrayList中每个对象的所有字段(以及它们的值)。如何查找C#中所有对象的公共字段?

目前我的代码如下:

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

     } 
    } 

当然,我明白了眼前的问题与此代码:如果它的工作它会只打印在ArrayList中每个对象的一个​​领域。稍后我会解决这个问题 - 现在我只是好奇如何获取与对象关联的所有公共字段。

编辑:对不起,翻转答案这么多。在选择答案之前,我应该尝试每种方法。

+0

您的代码将打印出此: System.Reflection.FieldInfo [] – 2008-10-26 01:21:52

回答

21
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的工作;-)

+0

Nevermind。我更喜欢这种技术。我可以推断这个来获得属性(甚至是方法)。谢谢一堆! – junkforce 2008-10-26 01:09:01

+1

Thx为.where条件戴夫..我知道这是10年后,但我喜欢它。直截了当..只公开..不需要getsetters ..并且不用担心它仍然可以在VS 2017中使用c#.net 4.6.2和core:p – Goodies 2018-01-05 01:56:01

4
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没有必要为type.GetFields()作为

返回值 - 类型:由MSDN状态定义System.Reflection.FieldInfo []

字段信息对象的数组代表所有为当前类型定义的公共字段

+0

什么是PropertyInfo和FieldInfo的命名空间? – junkforce 2008-10-26 01:00:51

1
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()); 
      } 
     } 
    } 
6

您可以获取所有的对象字段直接与的BindingFlags类中声明:

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

和所有的对象领域,包括继承了:

GetFields(BindingFlags.Public | BindingFlags.Instance) 
1

当然,另一个问题将是“为什么你有公共领域?” - 性能更好。作为一个抽象,请注意反射不是唯一的选择:类型也可以在运行时即时暴露它的属性(例如未命名的DataTable/DataView将列公开为属性)。

为了支持这种(同时也支持简单的物体),你可以使用TypeDescriptor

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

这也使得众多的扩展选项 - 例如,大大speeding up reflection(不改变任何代码)。

相关问题