2014-10-17 73 views
1
public T getValueByName<T>(String name) 
{ 
    if(T is List) 
     Object containedType = T.WhatGoesHere()? 
... 

在上面的代碼中,我需要知道是否可以將List轉換爲傳入的列表類型,例如List<Control>通用容器內部是什麼類型

有沒有辦法查詢包含類型的泛型?我能得到List<Control>List<String>List<Form>等。

我可能分裂的API來在所包含的類型傳入,因此需要調用者使用的列表一個方法,一個用於簡單類型一個單獨的方法返回列表。無論哪種方式,他們必須知道什麼是回來,但如果有一個順利的方式來做我所問的事情,我寧願保持簡單的API。

注意:這是缺少協方差的解決方案,因爲即使在包含的類型上定義了隱式轉換運算符,List到T的轉換也會失敗。所以,爲了遵循解決方案listOfB.Cast<A>();from here,我需要知道要投什麼(什麼是A)。

謝謝!

+2

可以使用的typeof(T),然後使用反射來獲取泛型類型參數 – Charleh 2014-10-17 14:13:37

+0

看到這個問題1 on:http://stackoverflow.com/questions/293905/reflection-getting-the-generic-parameters-from-a-system-type-in​​stance – Charleh 2014-10-17 14:15:22

+0

可能的重複[如何從通用列表中獲取T的類型 ](http://stackoverflow.com/questions/557340/how-to-get-the-type-of-t-from-a-generic-listt) – 2014-10-17 14:16:05

回答

4

您可以從typeof(T)開始,獲得代表TSystem.Type實例。 一旦你有了,你可以檢查Type.IsGenericType看看它是否是一個通用的,然後調用Type.GetGenericArguments()看看使用了什麼泛型參數。

例如,如果TList<int>IsGenericType將是trueGetGenericArguments()將返回含有一種元素的數組:System.Int32

例如,這裏是一個代碼片斷我寫,以查看是否在給定類型(可變type )是一些實現,如果IEnumerable<T>其中T未知。它首先必須看它是否是一個通用的,然後制定出它是否只有一個參數,確定所述參數,看看它是否實現了接口,給出這樣的說法:

if (type.IsGenericType) 
{ 
    Type[] genericArguments = type.GetGenericArguments(); 
    if (genericArguments.Length == 1) 
    { 
     Type proposedEnumerable = typeof(IEnumerable<>).MakeGenericType(genericArguments); 
     if (proposedEnumerable.IsAssignableFrom(type)) 
     { 

僅供參考,請參閱:

+1

這是我見過的最好的答案之一。非常感謝! – user1944491 2014-10-17 14:35:43

相關問題