2011-01-13 7 views
6

Estoy construyendo un pequeño ayudante para convertir objetos EF4 en POCO. (Sé que hay AutoMapper, pero estoy teniendo aC# dilema en este momento)C# Generics new() constraints with type: (new (T))

¿Cómo puedo hacer este trabajo (el donde P: nueva (E) no es legal deseo para asegurarse la clase P (POCO) como un constructor que toma la clase E (de ahí el manejo de la transformación)

¿Cómo puedo hacer este trabajo?

¿Cómo puedo hacer una función genérica en C# que puede tomar un nuevo (tipo) restricción?

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; 

Respuesta

8

No existe tal restricción. Lo que puede hacer es tener un parámetro adicional:

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

De esa manera no se requiere para ser un constructor, pero se pueden pasar en un delegado, que llamadas al constructor:

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

Tengo una idea de cielo azul que permitiría las restricciones del constructor, llamadas "static interfaces"; estas solo serían útiles para las restricciones genéricas, pero también permitirían algunos casos de uso del operador.

+0

"interfaces estáticas" - debe probar genéricos en F # –

2

no hay tal cosa como P : new(E), pero que podría tener la persona que llama suministrar un delegado que sabe cómo construir un P dado un E:

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; 
} 

Sin embargo, si usted está haciendo esto, como puede bien use LINQ: efList.Select(e => new P(e)).ToList().

+0

Donde P: nuevo (e) tiene el mismo problema ... pero creo que no necesita estar allí con el convertidor – Dani