2011-01-13 10 views
6

Sto costruendo un piccolo helper per trasformare oggetti EF4 in POCO. (So che c'è automapper, ma sto avendo aC# dilemma in questo momento)C# Generics new() vincoli con tipo: (new (T))

Come posso fare questo lavoro (il dove P: nuova (E) non è legale desidero fare in modo P (POCO) classe come un costruttore che prende la classe E (da qui la gestione della trasformazione)

come posso fare questo lavoro?

come posso fare una generica funzione in C# che può prendere una nuova (tipo) vincolo?

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; 

risposta

8

Non esiste un simile vincolo. Che cosa si può fare è avere un parametro aggiuntivo:

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

In questo modo non è necessario essere un costruttore, ma è possibile passare in un delegato che chiamate il costruttore:

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

Ho un'idea blu cielo che consentirebbe vincoli di costruzione, chiamati "static interfaces" - questi sarebbero utili solo per i vincoli generici, ma consentirebbero anche alcuni casi d'uso dell'operatore.

+0

"interfacce statiche" - dovresti provare i generici in F # –

2

Non c'è cosa come P : new(E), ma si potrebbe avere il chiamante fornisce un delegato che sa come costruire un P dato 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; 
} 

Tuttavia, se si sta facendo questo, si può usare bene LINQ: efList.Select(e => new P(e)).ToList().

+0

Dove P: nuovo (e) ha lo stesso problema ... ma penso che non sia necessario essere lì con il convertitore – Dani