С# общие методы, параметры типа в 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().