2010-06-08 57 views
2

我試圖創建從是從其他地方獲取特定類型的泛型列表:使用C#類型爲通用

Type listType; // Passed in to function, could be anything 
var list = _service.GetAll<listType>(); 

但是我得到的編譯錯誤:

The type or namespace name 'listType' could not be found (are you missing a using directive or an assembly reference?) 

是這甚至可能或者我將腳踏上C#4動態領土?

作爲背景:我想從存儲庫中自動加載所有列表中的數據。下面的代碼得到了一個表單模型,它的屬性被迭代用於任何IEnum(其中T繼承自DomainEntity)。我想填充列表中的類型對象從存儲庫中創建的列表。

public void LoadLists(object model) 
{ 
    foreach (var property in model.GetType() 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty)) 
    { 
     if (IsEnumerableOfNssEntities(property.PropertyType)) 
     { 
      var listType = property.PropertyType.GetGenericArguments()[0]; 

      var list = _repository.Query<listType>().ToList(); 

      property.SetValue(model, list, null); 
     } 
    } 
} 

回答

3

你不能傳遞一個變量作爲泛型類型/方法的參數,但是你可以通過做一些反思簡單的事情,比如你可以建構列表這樣:

Type listType = typeof(int); 
var list = Activator.CreateInstance(typeof(List<>).MakeGenericType(listType)); 

不知道如果它會有幫助,因爲您需要將該列表轉換爲某些內容以使其有用,並且無法將其轉換爲泛型類型/接口而不指定泛型類型參數。

您仍然可以通過將其轉換爲非通用版本的接口ICollection,IList,IEnumerable來添加/枚舉此列表。

+0

是的,我認爲可能是這種情況。我正在使用系統中其他位置的方法()中的列表,因此無法從頭開始創建列表。謝謝你的幫助! – 2010-06-08 05:18:43

+0

您也可以使用反射來調用泛型方法,但結果仍然會出現同樣的問題。查閱這篇關於動態泛型方法調用的文章:http://www.codeproject.com/KB/dotnet/InvokeGenericMethods.aspx – max 2010-06-08 10:31:06

0

你需要告訴它的類型listType是

var list = _repository.Query<typeof(listType)>().ToList(); 
+0

對不起,但它已經是一個Type。 typeof()用於轉換類,接口等的名稱(即,如果你要訪問它的靜態方法)。 – 2010-06-08 05:16:49

+0

你是對的。 – MQS 2010-06-08 14:44:57