c # Общие ограничения new () с типом: (new (T)) - PullRequest
6 голосов
/ 13 января 2011

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

Как я могу сделать эту работу (, где P: new (E) не разрешено Iхотите убедиться, что класс 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 ]

8 голосов
/ 13 января 2011

Нет такого ограничения. То, что вы можете сделать, это иметь дополнительный параметр:

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

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

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

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

2 голосов
/ 13 января 2011

Нет такой вещи, как 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().

2 голосов
/ 13 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...