Общие методы C #, параметры типа в ограничении конструктора new () - PullRequest
16 голосов
/ 29 июля 2010

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

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

Ответы [ 3 ]

28 голосов
/ 29 июля 2010

Не совсем; 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));
5 голосов
/ 29 июля 2010

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

where T : new()

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

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

2 голосов
/ 29 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...