2013-09-11 40 views
0

初學者的集合: 想寫返回一個泛型集合的方法:如何返回基於輸入(通用)

public IEnumerable<T> ABC(string x){ 

if(x== "1") 
{ Collection<A> needs to be returned} 

if(x=="2") 
{ Collection<B> needs to be returned} 
.. 
so on 
} 

問題: - 基於傳遞給方法「X」不同類型的集合被初始化並需要返回?我怎樣才能做到這一點? - 這是正確的方法嗎? - 可以獲得更多通用用途細節的鏈接?

回答

1

AFAIK,類型參數(這裏是T)必須在編譯時已知。這意味着它在運行時不能改變。你可以做的是做到IEnumerable<Object>。由於每個其他類型都有Object作爲基本類型,所以我很肯定你可以在那個時候返回一個IEnumerable。儘管您可能需要在路上投入/運出Object。

0

不需要傳遞字符串來標識類的類型。只需調用下面的泛型方法,它就會初始化那個T類型的List。

 /// <summary> 
     /// Gets the initialize generic list. 
     /// </summary> 
     /// <typeparam name="T"></typeparam> 
     public IList<T> GetInitializeGenericList<T>() where T : class 
     { 
      Type t = typeof(List<>); 
      Type typeArgs =typeof(T); 
      Type type = t.MakeGenericType(typeArgs); 
      // Create the List according to Type T 
      dynamic reportBlockEntityCollection = Activator.CreateInstance(type); 

      // If you want to pull the data into initialized list you can fill the data 
      //dynamic entityObject = Activator.CreateInstance(typeArgs); 

      //reportBlockEntityCollection.Add(entityObject); 

      return reportBlockEntityCollection; 
     } 
+0

爲什麼不使用'return new List ();'而不是使用激活器,如果你打算使用泛型? (也許我只是錯過了一些東西。) –

+0

是的,如果你想只是初始化T的列表,你可以返回新的列表()。但如果你需要添加一些數據到它,那麼它在這種情況下失敗。您不能創建使用泛型的實例。 –

+0

當然可以。取一個「T」的實例(或集合),並在「新建」集合中使用'.Add()'或'AddRange()'。 –