2010-12-06 23 views
0

質問に答えるよりも尋ねるのが難しいと思います。 私の質問に例をあげておきたいと思います: オブジェクトをDataSourceにバインドすることができ、そのオブジェクトはどんなタイプでもかまいません。つまり、データセットのDataSourceに「MyClass」タイプのオブジェクトをバインドしたとします。 これで、このデータセットを別のDLLの別のクラスにパラメータとして送信し、このDLLファイルで "MyClass"タイプのリスト<を作成します。- 型をパラメータとして渡す方法

_dataSet.DataSource.GetType() 

を私はMyClassの「の種類の一覧を作成するには、次のようなコードを使用することはできません:私はデータソースの種類を取得するには、このコードを使用することができます「MyClassの」型にアクセスしていないとして ": List<_dataSet.DataSource.GetType()> _list;

この場合、どうすればよいですか?

+2

public class SomeOtherClassInSomeOtherDLL { public void DoSomethingWithData<T>(T dataSource) { // ... List<T> list = new List<T>(); list.Add(dataSource); // ... } } 

だから、このようにそれを呼ぶだろうか?ジェネリックリストを使用する唯一の理由は、そのタイプを使用することができないタイプなので、単純なオブジェクト配列を使用する可能性があるためです。 – Doggett

+1

反射とジェネリックスは一般的に良いベッドメイトではありません...もちろんできますが、あらゆるステップであなたを戦います...私はもっとシンプルなデザインを考えています(そしていくつかあります) –

答えて

1

があり基本的に2つのオプションがあります

  1. List<object>とスティックや、_dataSet.DataSource
  2. のより良い、私たちの最も近い既知の祖先型や厄介な反射が動的にList<T>をインスタンス化するためにハックを使用します。

私は個人的にオプションに頼るだろう(1)ほとんどの場合、それがあるので:読める

  • 使いやすく、
  • は十分に安全な入力で
  • ユニバーサル自然コードの再利用の条件。

もう1つのオプションは、すでに他の回答で詳述されています。

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

あなたは動的にリフレクションを使用してジェネリック型を作成することができますlistobjectとして入力されることを

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

は注意を。

+1

あなたは爪タイプはILi​​stにキャストすることでもう少し減りましたが、それはあなたが得るほど具体的です。 – LukeH

0

リフレクションを使用して、目的のタイプのジェネリックリストをインスタンス化する必要があります。このメソッドは、トリックを行う必要があります:

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

    return instance ; 
} 
0

他の答えが指摘しているように、あなたは反射を使用することができます。

他のDLLの他のクラスを制御できますか?あなたは、そのクラス、またはあなたがそのクラスに対して呼び出している特定のメソッドを汎用的にすることができますか?このかかわらを行う際にポイントになり何

 var anotherClass = new SomeOtherClassInSomeOtherDLL(); 

     // ... 

     anotherClass.DoSomethingWithData(_dataSet.DataSource as MyClass); 
関連する問題