2012-09-05 180 views
1

使用反射:獲取泛型類型的參數的實例的屬性值

如果我有X<Y>類型的實例(我不知道Y到底是什麼),因爲X是一個通用型(X<T>),怎麼辦我得到Y上的房產價值?

喜歡的東西:

Type yType = currentObject.GetType().GetGenericArguments()[0]; 

// How do I get yInstance??? 
var yInstance = Convert.ChangeType(???, yType); 

我需要去:

object requiredValue = yType.GetProperty("YProperty").GetValue(yInstance, null); 
+0

這取決於'X'是什麼以及它如何與'Y'相關。例如,如果'X'是一個集合,那麼'Y'可能是該集合中的一個項目。 –

+0

X是一個自定義類類型,Y也是一個自定義類類型。 – user1647697

+0

再說一遍,它們是如何相關的?_是否有'X'屬性給你一個'Y'? 'X'屬性是否具有屬性類型爲'Y'的屬性? _好,這取決於他們是如何相互關聯的。 –

回答

2

獲得PropertyInfo對象爲一般的參數使用:

PropertyInfo myProperty = myGenericType.GetType().GenericTypeArguments[0].GetProperty("myPropertyName"); 

,其中 「0」 是類定義中泛型類型的索引和「myPropertyName」是屬性的名稱。在此之後,使用它,你會任何其他PropertyInfo對象,例如:

myProperty.GetValue(obj); // Where obj is an instance of the generic type 

[編輯:低於原來的答案]

如果爲Y必須有一個屬性,約束類型T的一個必須實現一個包含該屬性的接口。例如:

public class MyGenericClass<Y> where Y:IMyInterface 

然後將通用對象轉換爲接口並調用屬性。

+0

不幸的是不能做到這一點。 Y已經有一個接口,並且已經有一組通用屬性。但是我需要一個特定於Y的類型的屬性,它不在接口中。 – user1647697

+0

@ user1647697我已經更新了相應的答案。 – akton

+0

感謝但不同的Y類型會有不同的屬性集。所以我不能使用界面。 – user1647697