Подтвердить что ты не робот

Общий тип конструктора

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

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

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

Я хочу, чтобы кто-то создал объект вроде:

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

Ответ 1

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

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

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

EDIT: согласно комментариям...

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

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

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);