Общий тип в конструкторе - PullRequest
38 голосов
/ 31 марта 2009

У меня есть интерфейс универсального типа и я хочу, чтобы конструктор объекта брал в интерфейсе универсального типа.
Как:

public Constructor(int blah, IGenericType<T> instance)
{}

Я хочу, чтобы код, который создает этот объект, указывал IGenericType (используйте Inversion of Control). Я не видел, как это произошло. Любые предложения для достижения этой цели?

Я хочу, чтобы кто-то создал объект, подобный:

Constructor varname = new Constructor(1, new GenericType<int>());

1 Ответ

46 голосов
/ 31 марта 2009

Вы не можете сделать конструкторы общими, но вместо этого вы можете использовать универсальный статический метод:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)

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

РЕДАКТИРОВАТЬ: Согласно комментариям ...

Если вы хотите сохранить аргумент во вновь созданном объекте, и вы хотите сделать это строго типизированным способом, то тип также должен быть универсальным.

В этот момент проблема конструктора исчезнет, ​​но вы можете в любом случае захотеть сохранить статический универсальный метод в неуниверсальном типе, поэтому вы можете воспользоваться преимуществами вывода типа:

public static class Foo
{
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance)
    {
        return new Foo<T>(instance);
    }
}

public class Foo<T>
{
    public Foo(IGenericType<T> instance)
    {
        // Whatever
    }
}

...

IGenericType<string> x = new GenericType<string>();
Foo<string> noInference = new Foo<string>(x);
Foo<string> withInference = Foo.CreateInstance(x);
...