Указание ограничения конструктора для общего параметра [дубликат
-
25-09-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
У меня есть коллекция объектов, которые я пропускаю в качестве параметра для создания объектов другого типа (один на один). Я делаю это во многих местах (в основном преобразуя из объектов данных на бизнес объекты). Я хочу написать универсальный метод расширения для достижения этого. Но я застрял, потому что я не знаю, как я могу указать ограничение, что бизнес-объект имеет конструктор, принимающий объект данных в качестве параметра. Ниже приведен код моей функции:
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));