2009-03-31 3 views
31

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

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

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

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

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

ответ

40

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

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

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

EDIT: В соответствии с комментариями ...

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

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

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

Я бы как сохранить IGenericType в качестве члена var, чтобы сделать это, я думаю, мне пришлось бы сделать весь класс общим не только методом ...? – CSharpAtl

+0

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

+0

хотел бы запустить мою дизайнерскую идею, чтобы увидеть, есть ли что-то принципиально лучше. Не думаю, что я могу напечатать все это в этом комментарии. Могу ли я опубликовать ваш блог или отправить вам по электронной почте? – CSharpAtl