2010-12-06 25 views
0

我認爲問題比回答問題更困難。 我想用一個例子問我的問題: 您知道我們可以將一個對象綁定到一個DataSource,並且該對象可以是任何類型。所以假設我已經將一個「MyClass」類型的對象綁定到DataSet的DataSource。 現在我將這個數據集作爲參數發送給另一個DLL中的另一個類,並且在這個DLL文件中,我想創建一個類型爲「MyClass」的列表<>。 由於我沒有獲得「MyClass的」 I型可以使用此代碼來獲取數據源的類型:C# - 如何傳遞一個類型作爲參數

_dataSet.DataSource.GetType() 

,但我不能使用如下代碼創建類型「的MyClass的名單「: List<_dataSet.DataSource.GetType()> _list;

在這種情況下該怎麼辦?

+2

會是什麼在做這個,雖然意義呢?你想要泛型列表的唯一原因是你可以使用特定的類型,因爲你不知道你不能使用它的類型,不妨使用一個簡單的對象數組。 – Doggett 2010-12-06 20:58:07

+1

反射和泛型通常不是好的牀友......當然可以這樣做,但它在每一步都會對抗你......我會考慮一個更簡單的設計(是的,有幾個) – 2010-12-06 21:05:39

回答

1

基本上有兩種選擇:

  1. 堅持使用List<object>或者更好的,我們最近的已知祖先的_dataSet.DataSource
  2. 類型或使用反射討厭破解實例化一個List<T>動態。

我個人訴諸選項(1)在大多數情況下,因爲它是:

  • 更容易使用,
  • 可讀,
  • 足夠類型安全,
  • 普遍在自然的代碼重用條款。

第二個選項已在其他答案中詳細闡述。

0
var newtype = typeof (List<>).MakeGenericType(_dataSet.DataSource.GetType()); 
var _list = Activator.CreateInstance(newtype); 
0

您可以使用反射動態地創建一個泛型類型:

var listType = typeof(List<>).MakeGenericType(
    new[] { _dataSet.DataSource.GetType() } 
); 
var ctor = listType.GetConstructor(new Type[] { }); 
var list = ctor.Invoke(null); 

注意list將分型爲object

0

您需要使用反射來實例化所需類型的通用列表。這種方法應該是訣竅:

public object InstantiateGenericList(Type nodeType) 
{ 
    Type list  = typeof(List<>) ; 
    Type genericList = list.MakeGenericType(nodeType) ; 
    object instance = Activator.CreateInstance(genericList) ; 

    return instance ; 
} 
0

您可以使用反射,因爲其他答案已經指出。

你有控制另一個DLL中的其他類嗎?你可以讓這個類或你調用該類的特定方法是通用的嗎?

public class SomeOtherClassInSomeOtherDLL 
{ 
    public void DoSomethingWithData<T>(T dataSource) 
    { 
     // ... 

     List<T> list = new List<T>(); 
     list.Add(dataSource); 

     // ... 
    } 
} 

所以,你會這樣稱呼它:

 var anotherClass = new SomeOtherClassInSomeOtherDLL(); 

     // ... 

     anotherClass.DoSomethingWithData(_dataSet.DataSource as MyClass);