2011-01-13 20 views
6

EF4オブジェクトをPOCOに変換するための小さなヘルパーを構築しています。 (私はAutoMapperがあると知っているが、私は、この時点でのAC#のジレンマを抱えている)C#Generics new()型の制約:(新規(T))

どのように私はこの仕事(P行うことができます:新しい(E)が法的 ではありませんが、私は確かにしたいですP(それゆえ変換を扱う)Eクラス を取るコンストラクタとして(POCO)クラス

どのように私はこの仕事をすることができますか?

どのように私は新しいを取ることができますC#での汎用関数を作ることができます(タイプ)制約?

public static List<P> ListConvert<E, P>(List<E> efList) where P: new(E) 
    { 
     List<P> pList = new List<P>(); 

     foreach (E item in efList) 
     { 
      P myItem = new P(item); 
      pList.Add(myItem); 
     } 
     return pList; 

答えて

8

このような制約はありません。何を行うことができますことは、余分なパラメータを持っている:

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> func) 

コンストラクタである必要はないが、あなたはコンストラクタを呼び出すデリゲートを渡すことができますこの方法:

ListConvert(list, x => new Foo(x)) 

私は、コンストラクタの制約("static interfaces")を有効にする青空のアイデアを持っています。これらは一般的な制約にのみ役立ちますが、演算子の使用例もいくつか有効になります。

+0

静的インターフェース - F# –

2

ありP : new(E)のようなものはませんが、あなたは、呼び出し元がE与えPを構築する方法を知っているデリゲートを供給するかもしれない:

public static List<P> ListConvert<E, P>(List<E> efList, Func<E, P> converter) 
{ 
    List<P> pList = new List<P>(); 

    foreach (E item in efList) 
    { 
     P myItem = converter(item); 
     pList.Add(myItem); 
    } 
    return pList; 
} 

あなたがこれをやっている場合は、あなたにしてもよいですLINQ:efList.Select(e => new P(e)).ToList()をよく使用してください。

+0

でジェネリックスを試してみてください。どこのP:new(e)にも同じ問題があります...しかし、私はそれがコンバータにある必要はないと思います – Dani

関連する問題