2012-09-17 77 views
0

有沒有什麼方法可以檢測類中泛型參數中指定的類型?使用反射識別類的通用類型

例如,我有三類以下:

public class Customer 
{ } 

public class Repository<T> 
{ } 

public class CustomerRepository : Repository<Customer> 
{ } 

public class Program 
{ 
    public void Example() 
    { 
     var types = Assembly.GetAssembly(typeof(Repository<>)).GetTypes(); 
     //types contains Repository, and CustomerRepository 
     //for CustomerRepository, I want to extract the generic (in this case, Customer) 
    } 
} 

對於每個庫對象的帶回來,我希望能夠告訴指定什麼類型。
這可能嗎?

編輯

感謝@CuongLe,得到這個這是工作,但看起來雜亂無章.... (也ReSharper的幫助;))

var types = Assembly.GetAssembly(typeof(Repository<>)) 
.GetTypes() 
.Where(x => x.BaseType != null && x.BaseType.GetGenericArguments().FirstOrDefault() != null) 
.Select(x => x.BaseType != null ? x.BaseType.GetGenericArguments().FirstOrDefault() : null) 
.ToList(); 
+0

這將是更容易幫助,如果你提供有效的C#。而第三類,雖然有效,你的意思是像公共類CustomerRepository:儲存庫'? –

+0

* var repositories = Assembly.GetAssembly(typeof(Repository <>))*這是有效的嗎? –

+0

@CongLong是的,它是 – Alex

回答

2

假設你現在從類型列表中選擇持有CustomerRepository類型:

var customerType = typeof(CustomerRepository).BaseType 
          .GetGenericArguments().First(); 

編輯:你不需要信任重新沙坡100%。由於您選擇Where來選擇其所有類型的BaseType不是null,因此無需再在Select中檢查。如需更多信息,FirstOrDefault實際上將返回null,該代碼進行了優化:

Assembly.GetAssembly(typeof(Repository<>)) 
        .GetTypes() 
        .Where(x => x.BaseType != null) 
        .Select(x => x.BaseType.GetGenericArguments().FirstOrDefault()) 
        .ToList(); 
+0

幾乎在那裏....看到我編輯的問題 – Alex

+0

@alexjamesbrown:你有什麼問題,新的編輯? –

1

使用GetGenericArguments嘗試。

+0

試過,只是回來了Name = T ....不是我期望的「客戶」類型? – Alex

+0

請詳細說明您正在調用此類型的類型。 –

+0

編輯的問題,以提供更好的例子 – Alex