2010-10-13 102 views
1

我有列表(報告)。報告有90個屬性。我不想寫他們每個屬性來獲得屬性值。有沒有啥子從列表迭代列表中的所有屬性

防爆得到化子性質值:

Dim mReports as new List(Of Reports) 
mReport = GetReports() 

For each mReport as Report In mReports 
    'Here I want get all properties values without writing property names 
next 
+1

你想對值做什麼? – SLaks 2010-10-13 17:09:16

回答

6

您可以使用反射:

static readonly PropertyInfo[] properties = typeof(Reports).GetProperties(); 

foreach(var property in properties) { 
    property.GetValue(someInstance); 
} 

然而,這將是緩慢的。

一般來說,一個具有90個proeprties的類是糟糕的設計。
考慮使用字典或重新考慮您的設計。

1
PropertyInfo[] props = 
    obj.GetType().GetProperties(BindingFlags.Public |BindingFlags.Static); 
foreach (PropertyInfo p in props) 
{ 
    Console.WriteLine(p.Name); 
} 
1

我不會說流利的VB.NET,但是你可以很容易地將這樣的東西翻譯成VB.NET。

var properties = typeof(Report).GetProperties(); 
foreach(var mReport in mReports) { 
    foreach(var property in properties) { 
     object value = property.GetValue(mReport, null); 
     Console.WriteLine(value.ToString()); 
    } 
} 

這叫做reflection。你可以在MSDN的.NET中閱讀它的使用。我使用Type.GetProperties來獲取屬性列表,並使用PropertyInfo.GetValue來讀取值。您可能需要添加各種BindingFlags或檢查屬性,如PropertyInfo.CanRead才能獲得所需的屬性。此外,如果您有任何索引屬性,則必須相應地將第二個參數調整爲GetValue

1

聽起來很適合反射或元編程(取決於所需的性能)。

var props=typeof(Report).GetProperties(); 
foreach(var row in list) 
foreach(var prop in props) 
    Console.WriteLine("{0}={1}", 
     prop.Name, 
     prop.GetValue(row));