Есть ли способ создать Общий метод, который использует new()
ограничение конструктора для требования классов с конструкторами определенных типов?
Например:
У меня есть следующий код:
public T MyGenericMethod(MyClass c) where T : class
{
if (typeof(T).GetConstructor(new Type[] { typeof(MyClass) }) == null)
{
throw new ArgumentException("Invalid class supplied");
}
// ...
}
Действительно ли возможно иметь что-то вроде этого вместо этого?
public T MyGenericMethod(MyClass c) where T : new(MyClass)
{
// ...
}
Править: Существует предложение относительно этого. Голосуйте, таким образом, у нас может быть эта функция в C#!
Не совсем так; C# поддерживает только ограничения конструктора 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));
Нет, в C# невозможно ограничить общий тип, чтобы он имел конструктор определенной сигнатуры. Только конструктор без параметров поддерживается функцией new().
Нет. К сожалению, общие ограничения позволяют включать только:
where T : new()
Что указывает, что есть конструктор по умолчанию, без параметров. Не существует способа ограничить тип с конструктором, который принимает определенный тип параметра.
Подробнее см. в Ограничения на параметры типа.