2010-09-27 24 views
0

我試圖找到的第一個屬性,即Integer ..並獲取它的值。嘗試使用反射來查找類的第一個Int32屬性

所以我得到了下面的代碼..它總是返回false:

foreach(var property in type.GetProperties(BindingFlags.Public | 
    BindingFlags.Instance)) 
{ 
    var someType = property.PropertyType is int; // Always false. 
} 

這是爲什麼呢/我做了什麼錯。這應該是很簡單:(

/我是有一個糟糕的一天...

回答

4

更改測試:

var firstInt32Property = property.PropertyType == typeof(int); 

這是必要的,因爲酒店的財產型本身不是一個整數:它是一個System.Type對象,它(鬆散地)表示屬性獲取器返回/屬性設置器接受的類型。另一方面,調用包含類型實例的屬性getter將生成一個實際整數

下面是使用LINQ,而不是foreach循環的方式:(。如果沒有這樣的屬性存在,這會拋出異常)

var firstInt32Property = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) 
          .First(p => p.PropertyType == typeof(int)); 


要檢索的屬性的值從包含類型的實例:

int value = (int)firstInt32Property.GetValue(myObj, null); 

這當然會失敗,如果t他'第一'Int32財產碰巧是一個索引或確實如果它根本沒有一個getter。如果可能的話,您可以在原始查詢中過濾這些屬性。


另外請注意,這個代碼是有限的使用,因爲「一類,它是一個整數的第一個屬性」的想法是有點可疑。從Type.GetProperties

GetProperties的方法做在一個特定 爲了不 返回的屬性,如字母或 聲明順序。您的密碼不得 取決於 屬性返回的順序,因爲該 順序會有所不同。

+3

您可以在這裏使用==代替.Equals,因爲Type對象對於特定類型是唯一的。不是批評 - 當然你的代碼會起作用 - 我只是覺得==更易於閱讀。 – 2010-09-27 05:23:16

+0

嗯..不知道如何定義第一個屬性。我的意思是,有些類有一個'int'作爲它們的第一個屬性。我真的想創建一個'接口',這意味着我可以輕鬆地獲取任何實現該接口的實例後的屬性..但是我不能在這裏做到這一點。無論如何,我並沒有關於實際上攫取「錯誤的」int屬性。這只是一些研發的東西。 – 2010-09-27 05:23:48

+0

+1正好,PropertyType中的內容不是int的一個實例,是System.Type的一個實例。 – eglasius 2010-09-27 05:25:51