Подтвердить что ты не робот

Указание ограничения конструктора для общего параметра

У меня есть набор объектов, которые я передаю как параметр для создания объектов другого типа (один на один). Я делаю это во многих местах (в основном, преобразование из объектов данных в бизнес-объекты). Я хочу написать общий метод расширения для этого. Но я застрял, потому что не знаю, как я могу указать ограничение, что бизнес-объект имеет конструктор, который принимает объект данных в качестве параметра. Ниже приведен код моей функции:

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
                    where T : new(A)/*THIS IS PROBLEM PART*/
{
    var ret = new List<T>();

    foreach (var item in list)
    {
        ret.Add(new T(item));
    }
    return ret;
}
4b9b3361

Ответ 1

К сожалению, это не разрешено в С#. У вас может быть ограничение new(), которое заставляет тип иметь конструктор по умолчанию, но это единственное связанное с конструктором ограничение, поддерживаемое .NET.

Лучше всего выбрать интерфейс, который вы можете использовать, и ограничить интерфейс. Вместо того, чтобы пытаться установить объект при построении, вы можете использовать метод стиля "Инициализировать", который принимает объект "A" и вызывает это.

Ответ 2

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

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc)
{
    return list.Select(constructionFunc).ToList();
}

И используйте его следующим образом:

var IList<T> converted = someSequence.ConvertTo(a => new T(a));