Общие методы C#, введите новые параметры () ограничение конструктора

Есть ли способ создать Общий метод, который использует 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#!

17
задан Meryovi 11 November 2014 в 12:18
поделиться

3 ответа

Не совсем так; 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));
28
ответ дан 30 November 2019 в 11:51
поделиться

Нет, в C# невозможно ограничить общий тип, чтобы он имел конструктор определенной сигнатуры. Только конструктор без параметров поддерживается функцией new().

2
ответ дан 30 November 2019 в 11:51
поделиться

Нет. К сожалению, общие ограничения позволяют включать только:

where T : new()

Что указывает, что есть конструктор по умолчанию, без параметров. Не существует способа ограничить тип с конструктором, который принимает определенный тип параметра.

Подробнее см. в Ограничения на параметры типа.

6
ответ дан 30 November 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: