2013-10-16 70 views
1

將泛型與Type參數混合可能嗎?例如,有沒有像這樣寫代碼的方式:將類型參數傳遞給用於指定泛型的方法

IList GetListOfListsOfTypes(Type[] types) 
{ 
    IList<IList> listOfLists = new List<IList>(); 

    foreach (Type t in types) 
    { 
     listOfLists.Add(new List<t>()); 
    } 

    return listOfLists.ToList(); 
} 

顯然,編譯器不喜歡這樣,但有某種方式來實現這一目標?

+2

你不能讓它與編譯器一起工作。但是你可以使用反射調用通用構造函數。 – driis

+0

http://stackoverflow.com/questions/1603170/conversion-of-system-array-to-list –

+2

可能的重複這不是重複的,因爲它使用泛型類型,而鏈接只指定靜態系統類型。 –

回答

4

要做到這一點與反射,你必須從打開類型構造封閉泛型類型;然後使用反射來爲其構建一個選項。 Activator.CreateInstance很好地工作:

IList GetListOfListsOfTypes(Type[] types) 
{ 
    IList<IList> listOfLists = new List<IList>(); 

    foreach (Type t in types) 
    { 
     Type requestedTypeDefinition = typeof(List<>); 
     Type genericType = requestedTypeDefinition.MakeGenericType(t); 
     IList newList = (IList)Activator.CreateInstance(genericType); 
     listOfLists.Add(newList); 
    } 

    return listOfLists; 
} 

要知道,你是從這個方法,因爲我們不知道這個類型在編譯時這是必要的返回非通用IList個列表,所以爲了使用新的通用列表,您可能需要再次使用反射。考慮一下它是否值得 - 當然,這取決於你的要求。

+0

+1 - 這很好,因爲它實際上會在返回父列表之後爲子列表保留正確的類型。 –

相關問題