ограничения C# Generics new () с типом: (new (T))

Я создаю небольшой помощник, чтобы превратить объекты EF4 в POCOs. (Я знаю, что есть AutoMapper, но у меня сейчас дилемма c#)

Как я могу сделать эту работу (том где P: new (E) не законно Я хочу убедиться, что класс P (POCO) как конструктор, который принимает класс E (следовательно, обработка преобразования)

Как я могу это сделать ?

Как я могу сделать общую функцию в 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;

3 ответов


такого ограничения нет. Что ты!--3-->can do имеет дополнительный параметр:

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

таким образом, не обязательно быть конструктором, но вы можете передать делегат, который звонки конструктора:

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

у меня есть идея голубого неба, которая включала бы ограничения конструктора, называемые "статические интерфейсы" - они будут полезны только для общих ограничений, но также позволят использовать некоторые варианты использования операторов.


Это невозможно. The new ограничение позволяет создавать объекты только через открытый конструктор без параметров.


нет такой вещи, как P : new(E), но вы могли бы предоставить вызывающему делегату, который знает, как построить P предоставлена 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;
}

однако, если вы это делаете, вы можете также использовать LINQ:efList.Select(e => new P(e)).ToList().