2016-02-02 182 views
1

說我有一個這樣的類:C#泛型反射屬性類型

public class TestClass <T> 
{ 
    public T Prop { get; set; } 
} 

我試圖找出屬性類型爲T,而不是被例如傳遞的實際類型int 爲了澄清這多一點:

TestClass<int> tc=new TestClass<int>(); 
tc.GetType().GetProperty("prop").PropertyType.Name; //this returns int, but I need "T" 

回答

5

當你創建一個TestClass<int>例如,你有一個具體化的泛型類型 - 屬性int,不T

要獲取實際的泛型類型,你可以使用GetGenericTypeDefinition

var genericType = tc.GetType().GetGenericTypeDefinition(); 
var typeName = genericType.GetProperty("Prop").PropertyType.Name; 

如果你想實際類型和一般類型參數來區分,可以使用Type.IsGenericParameter

genericType.GetProperty("Prop").PropertyType.IsGenericParameter // true 
+0

謝謝,這正是我需要的。我可能終於明白'GetGenericTypeDefinition()' – czubehead

3

請注意,如果您使用的是C#6,並且需要泛型類型參數的名稱,那麼您可以根本不使用反射:

var name = nameof(T); // "T" 

如果你需要它的類以外的泛型類型參數的名字,則需要使用反射(見Luaan's answer