Учебный класси Activator.CreateInstance - PullRequest
6 голосов
/ 27 сентября 2011

Вот какой-то класс:

public class MyClass<T, C> : IMyClass where T : SomeTClass
                                              where C : SomeCClass
{
    private T t;
    private C c;


    public MyClass()
    {
        this.t= Activator.CreateInstance<T>();
        this.c= Activator.CreateInstance<C>();
    }
}

И я пытаюсь создать экземпляр объекта этого класса следующим образом:

            Type type = typeof(MyClass<,>).MakeGenericType(typeOfSomeTClass, typeOfSomeCClass);
            object instance = Activator.CreateInstance(type);

И все, что я получаю, это System.MissingMethodException (для этого объекта нет конструктора без аргументов) ...

Что не так с моим кодом?

Ответы [ 2 ]

8 голосов
/ 27 сентября 2011

Похоже, что typeOfSomeTClass или typeOfSomeCClass - это тип, который не имеет открытого конструктора без параметров, как того требуют:

this.t = Activator.CreateInstance<T>();
this.c = Activator.CreateInstance<C>();

Вы можете применить это через ограничение:

where T : SomeTClass, new()
where C : SomeCClass, new()

, в этом случае вы также можете сделать:

this.t = new T();
this.c = new C();
0 голосов
/ 27 сентября 2011

MakeGenericType должен использовать массив Type в этом контексте.

См. http://msdn.microsoft.com/en-us/library/system.type.makegenerictype.aspx

Например

Тип type = typeof (LigneGrille <,>). MakeGenericType(новый тип [] {typeOfSomeTClass, typeOfSomeCClass});

...