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

StackOverflow https://stackoverflow.com/questions/3408044

Вопрос

Этот вопрос уже имеет ответ здесь:

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

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;
}
Это было полезно?

Решение

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

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

Другие советы

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

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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top