2009-11-04 184 views
7

我有一個擁有大量屬性的對象。我想通過簡單地遍歷對象的屬性集合來獲取每個屬性的值。動態獲取屬性值

我查看了PropertyInfo.GetValue()方法,但它在我的上下文中沒有多大意義。

這裏是我想要做的(這個代碼不BTW工作)爲例:

foreach(var item in dataObjects) 
    { 
    foreach(PropertyInfo prop in item.GetType().GetProperties()) 
    { 
     String value = prop.GetValue().ToString() 
    } 
    } 

我現在認識到獲得一個屬性的值是不是很容易。我錯過了什麼?我不明白我需要傳遞給GetValue()方法,因爲我只是想要調用該方法的屬性的值。

感謝您爲我澄清這一點的任何幫助。我在這裏呆了幾個小時,把我的頭撞在桌子上。

+2

這是如何編譯? – Tinister 2009-11-04 16:27:11

+2

它沒有。這是我「想要」做的一個例子,而不是代碼的實際功能。 :) – 2009-11-04 16:38:36

回答

10

您需要提供您要撥打的財產有問題的特定對象:

prop.GetValue(item, null); 

的的PropertyInfo只是metatdata關於類型財產,而不是基於特定對象實例。 PropertyInfo不知道它來自哪個實例(如果有) - 只是它來自的類型/類。

您幾乎可以將PropertyInfo視爲屬性的名稱。這是沒有足夠的信息單獨做任何事情 - 我們然後不得不說「讓這個名字的財產的價值... 什麼?」關於我們提供的對象。

3

PropertyInfo表示屬性機器本身(類型,get方法,set方法等),而不是綁定到特定實例的屬性。如果屬性非靜態,則必須提供一個實例來讀取該屬性 - 這是GetValue的第一個參數。換句話說,如果pi是代表一些類和someObjectTest屬性PropertyInfo是類的一個實例:

object a = someObject.Test; 
object b = pi.GetValue(someObject, null); 

都沒有得到行對同一對象的相同屬性的值。如果該屬性是靜態的,那麼顯然不需要傳遞該實例(而是傳遞null)。第二個參數是索引屬性的索引--C#不支持索引屬性(它支持索引器,它們不完全相同),所以除非你工作,否則你可能永遠不需要傳遞任何東西,除了第二個參數爲null用一種支持索引屬性(如VB)的語言編寫的程序集中的某些類型,我相信。