2012-03-27 45 views
56

我有一個類包含幾個屬性(如果它有任何區別,所有都是字符串)。
我也有一個列表,其中包含許多不同的類的實例。c#foreach(property in property)...有沒有一個簡單的方法來做到這一點?

,同時爲我的課的一些單元測試,我決定,我通過列表中的每個對象,然後遍歷該對象的每個屬性要循環......

我認爲這樣做是那樣簡單。 ..

foreach (Object obj in theList) 
{ 
    foreach (Property theProperties in obj) 
    { 
     do some stufff!!; 
    } 
} 

但這沒有工作! :( 我得到這個錯誤...

「foreach語句無法在類型‘Application.Object’的變量操作,因爲‘Application.Object’不包含‘的GetEnumerator’一個公共定義」

不任何人都知道這樣做沒有噸IFS和循環或的一種方式,而不進入任何過於複雜

+4

未來,請不要在問題中說「不起作用」。相反,指定你遇到的問題(編譯器錯誤等)。謝謝! – 2012-03-27 15:52:42

+0

更新!感謝您的支持Robert – Jammerz858 2012-04-12 15:32:33

回答

91

這給一試:

foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
{ 
    // do stuff here 
} 

同時請注意,Type.GetProperties()有一個重載接受一組綁定標誌,以便您可以根據不同標準(如可訪問性級別)過濾掉屬性,請參閱MSDN以獲取更多詳細信息:Type.GetProperties Method (BindingFlags)最後但並非最不重要的是,不要忘記添加「system.Reflection」程序集引用。

例如解決所有的公共屬性:

​​

請讓我知道這是否正常工作。

+1

一旦你掌握了對象的屬性,是否有抓住每個屬性的價值?即姓名或郵編,例如 – JsonStatham 2015-10-01 10:49:19

2

使用反射來做到這一點

SomeClass A = SomeClass(...) 
PropertyInfo[] properties = A.GetType().GetProperties(); 
12

傻冒幾乎沒有,你只需要從類型獲取屬性,而非期望的屬性是在收集或財產包的形式訪問:

var property in obj.GetType().GetProperties() 

從那裏you can access like so

property.Name 
property.GetValue(obj, null) 

無線第GetValue第二個參數將允許您指定索引值,這將與返回集合的屬性一起工作 - 由於字符串是字符集合,因此如果需要,還可以指定索引以返回字符。

+0

我是否讓某人難過?我很樂於知道這有什麼不對,否則我可能永遠不會學習。 – 2012-03-27 15:56:40

+0

當你的代碼錯誤時(你的忍者編輯之前),你可能會得到downvote。 – 2012-03-27 15:58:06

13

當然,沒問題:

foreach(object item in sequence) 
{ 
    if (item == null) continue; 
    foreach(PropertyInfo property in item.GetType().GetProperties()) 
    { 
     // do something with the property 
    } 
} 
+0

你爲什麼添加這行? 'if(item == null)continue;'個人而言,我認爲如果你在那個時候得到了一個空對象,那麼出現了很多錯誤,那就是驗證應該在哪裏,或者我錯了? – Dementic 2016-12-01 17:58:08

+0

@Dementic:當然,我們可以說序列需要包含非空引用。 – 2016-12-01 23:00:35

20

你可以通過對象的所有類似的非索引屬性循環:

var s = new MyObject(); 
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) { 
    Console.WriteLine(p.GetValue(s, null)); 
} 

由於GetProperties()回報索引以及簡單的特性,您在致電GetValue之前需要額外的過濾器,以知道通過null作爲第二個參數是安全的。

您可能需要進一步修改篩選器以清除只寫和其他不可訪問的屬性。

+0

+1僅針對可以實際使用的屬性進行操作 - 您可能還想過濾掉只寫屬性。 – hvd 2012-03-27 16:14:58

+0

@ hvd這是隻寫屬性上的優點!我幾乎忘記了他們。如果我的代碼遇到一個具有null null屬性的屬性,它會崩潰,但我相信OP會弄清楚如何獲得他需要的屬性。 – dasblinkenlight 2012-03-27 16:19:09

+1

增加投票顯示如何獲得價值 – 2017-05-10 18:06:23

0

一句小心,如果「做某些事情」意味着更新您訪問的實際屬性的值,並且如果沿着從根對象到訪問屬性的路徑存在結構類型屬性,那麼您所做的更改在屬性上不會反映在根對象上。

相關問題