2008-10-26 45 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(不改變任何代碼)。

相關問題