С# общие методы, параметры типа в new() constor constraint
Есть ли способ создать общий метод, который использует ограничение конструктора new()
, чтобы требовать классы с конструкторами определенных типов?
Пример:
У меня есть следующий код:
public T MyGenericMethod<T>(MyClass c) where T : class
{
if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
{
throw new ArgumentException("Invalid class supplied");
}
// ...
}
Возможно ли иметь что-то подобное?
public T MyGenericMethod<T>(MyClass c) where T : new(MyClass)
{
// ...
}
EDIT: Здесь предложение относительно этого. Пожалуйста, проголосуйте, чтобы мы могли использовать эту функцию на С#!
Ответы
Ответ 1
Не совсем; С# поддерживает только конструкторы конструкторов no-args.
Обходной путь, который я использую для общих конструкторов arg, заключается в том, чтобы указать конструктор как делегат:
public T MyGenericMethod<T>(MyClass c, Func<MyClass, T> ctor) {
// ...
T newTObj = ctor(c);
// ...
}
то при вызове:
MyClass c = new MyClass();
MyGenericMethod<OtherClass>(c, co => new OtherClass(co));
Ответ 2
Нет. К сожалению, общие ограничения позволяют включать в себя:
where T : new()
Указывает, что существует конструктор без параметров без параметров. Невозможно ограничить тип конструктором, который принимает определенный тип параметра.
Подробнее см. Ограничения по параметрам типа.
Ответ 3
Нет, в С# невозможно ограничить тип общего типа конструктором конкретной сигнатуры. Только конструктор без параметров поддерживается функцией new().