Универсальные методы C #, параметры типа в ограничении конструктора new ()

Есть ли способ создать универсальный метод, который использует ограничение конструктора 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)
{
    // ...
}

РЕДАКТИРОВАТЬ: Там предложение по этому поводу. Пожалуйста, проголосуйте, чтобы у нас появилась эта функция на C #!


person Meryovi    schedule 29.07.2010    source источник
comment
Я немного запутался. Чего именно вы пытаетесь достичь? Конструктор примет параметр MyClass, или вы ограничиваете T до MyClass?   -  person Justin Niessner    schedule 29.07.2010


Ответы (3)


Не совсем; C # поддерживает только ограничения конструктора без аргументов.

Обходной путь, который я использую для универсальных конструкторов 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));
person thecoop    schedule 29.07.2010

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

where T : new()

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

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

person Reed Copsey    schedule 29.07.2010
comment
Да, я читал ту статью, но в ней не было очень конкретного ограничения new (). В любом случае спасибо, думаю, я оставлю свою валидацию там, где она есть ... - person Meryovi; 29.07.2010
comment
@Joel: Показанная ими опция - ЕДИНСТВЕННАЯ опция для ограничения new (). Нет возможности добавить параметры. - person Reed Copsey; 29.07.2010

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

person driis    schedule 29.07.2010
comment
Хотя это было бы неплохим дополнением! - person Meryovi; 29.07.2010