2012-02-18 7 views
1

ジェネリックC#クラスにどのように値を割り当てるのですか?汎用型のメンバーを汎用型のコンストラクタに割り当てる方法

public class GeneralWrapper<T> 
{ 
    public GeneralWrapper() 
    { 
     Datas = new ? 
    } 

    public T Datas { get; set; } 
} 

Listオブジェクト(任意のオブジェクト)の汎用ラッパークラスを作成しています。だから私は

GeneralWrapper<List<string>> _wrapper = new GeneralWrapper<List<string>>(); 
_wrapper.Datas.Add("hello") 

のように、このクラスを使用することができますが、件のデータが自動的に私がGeneralWrapper作成した後、私は新しい作成する必要がないように思わ

Datas = new Datas<t>(); 

のようにコンストラクタで初期化する必要がありますクラス。

答えて

5

あなたはジェネリック型にconstraintを使用することもできます。

public class GeneralWrapper<T> where T: new() 
{ 
    public GeneralWrapper() 
    { 
     Datas = new T(); 
    } 

    public T Datas { get; set; } 
} 

new()制約がTがデフォルト、パラメータなしのコンストラクタを保有タイプでなければならないことを示しています。これはコンパイル時に検証され、ジェネリッククラス内からこのオブジェクトをインスタンス化することを可能にします。

2

C#でジェネリック型パラメータのインスタンスを作成する機能はかなり制限されています。デフォルトでは、あなたは本当にだけで、すべてのT値ここで

のために働くnull

  • 使用default(T)を可能classnew T()
  • 拘束Tを可能new()にいくつかのオプション

    • 拘束Tを持っています複雑なコンストラクタ(少なくとも1つのパラメータを取るコンストラクタ)を使用するように見えますが、 。これをC#で直接行う方法はありません。代わりに、デリゲート/ラムダやファクトリパターンのようなより間接的なメカニズムが必要です。

      この場合、初期値をDatasに割り当てるように見えますが、それが公共のプロパティであることを考えると、おそらく最良の方法は何もせず、消費者がオブジェクト初期設定子を使ってプロパティを設定できるようにすることです。例えば。

      var x = new GeneralWrapper<MyType>() { 
          Datas = new MyType("hello", "world"); 
      }; 
      

      それとも、コンストラクタ

      public GeneralWrapper(T datas) { 
          Datas = datas; 
      } 
      
      に値を渡すためにそれらを強制する値は常に、割り当てられたことにしたい場合