2016-06-01 2 views
1

データベースモデルと通常のシステムモデルの2種類のオブジェクトがあります。新しい型制約付きの汎用コンストラクタ

私はモデルをデータベースモデルに変換することができたいと思います。

私は次のメソッドを持っている私が書いた:

public static E FromModel<T, E>(T other) 
      where T : sysModel 
      where E : dbModel 
{ 
    return new E(other); 
} 

を基本的にsysModeldbModel両方が抽象的です。

dbModelにはすべてコピーコンストラクタを持つ多くの継承クラスがあります。

イム受信:それは は技術的に時々私はマッチングを持っていけないことを認識して新しい()制約

イムを持っていないbecauase

は、型パラメータ「E」のインスタンスを作成できませんTのすべての値のコンストラクタです。少なくともデバッガが知っていることは分かります。

私はまた、where E : dbModel, new()という制約を追加しようとしましたが、それはちょうど無関係です。

ジェネリックメソッドとパラメータを使用してモデルを別のモデルに変換する方法はありますか?

ありがとうございました。あなたは、クラス/メソッドの定義にnew()制約を指定する必要があります、ジェネリック型にnewを使用するに

+0

を '新しい()'制約は、タイプを指定するためのパラメータなしのコンストラクタを持っています。あなたはおそらく、あなたが必要とするコピー構築のタイプを公開するインタフェースを介して、ある種のジェネリックファクトリメソッドを導入する必要があります。 – Anthony

+0

私は、実際にはコンストラクタを引数として渡さないようにしたいと思っています。 –

+1

ジェネリック型の引数にパラメータ付きのコンストラクタを置くことはできません。これを行うには、Activator.CreateInstanceを使用して残しておき、使用する型にコンストラクタが一致するよう祈ってください。一般的に、ジェネリック型を使用するソリューションは、実装に強く依存するため、この種のことを控えるべきです。これは、「このメソッドは任意のタイプのストレージクラス* ANY TYPE *を構築できるようにしたいが、コンストラクタ内に文字列パラメータを持たなければならず、ファイル名でなければならない」というようなものです。 –

答えて

3

public static E FromModel<T, E>(T other) 
     where T : sysModel 
     where E : dbModel, new() 

あなたは、コンストラクタのパラメータを使用しているので、あなたが使用することはできませんnewしかし、あなたの代わりにActivatorを使用することができますし、引数としてotherを渡す:

public static E FromModel<T, E>(T other) 
    where T : sysModel 
    where E : dbModel 
{ 
    return (E)Activator.CreateInstance(typeof(E), new[]{other}); 
} 
+0

はコンパイルするようです。何がクラッシュするだろうか?あらゆる種類の例外が投げられるようです。私はTを使うコンストラクタを見つける必要があることを理解しています。 –

+0

正確です。 'E'に単一のパラメータ' T'を取るコンストラクタがない場合、それは例外をスローします。 –

+0

素晴らしい、私はdb.illのバグと穴が2分で受け入れられるのを防ぐためにどちらかの方法で起きたいと思っています。 –

関連する問題