Инициализировать классы динамических типов

У меня есть метод, в котором мне нужно динамически изменять используемый класс в зависимости от пользовательских настроек, как показано ниже, класс dEnvelope также должен инициализировать свои свойства, чтобы заполнять все подклассы и использоваться таким же образом, все эти разные классы Year имеют точную структуру но бизнес-логика отличается своими внутренними методами

    dynamic dEnvelope;

    if (UserYear==2013)
        dEnvelope = new Years.Y2013.DataEnvelope();
    else
        dEnvelope = new Years.Y2012.DataEnvelope();


    dEnvelope.InnerClass= Activator.CreateInstance(Type.GetType(dEnvelope.InnerClass));

Однако я получаю сообщение об ошибке при выполнении строки Activator.CreateInstance

{"Значение не может быть нулевым.\r\nИмя параметра: typeName"}

Я что-то упустил в использовании динамического типа? Есть ли лучший способ динамического выбора правильного класса для использования во время выполнения?


person Maya    schedule 12.03.2013    source источник


Ответы (1)


Я думаю, вам следует сначала инициализировать переменную класса «Годы» через конструктор, а затем попытаться получить доступ к методу. то есть dEnvelope = new Years().Y2013.DataEnvelope();

А также, пожалуйста, покажите свой фрагмент кода для лучшего понимания.

person Kumar Shorav    schedule 12.03.2013
comment
Years.Y2013 и Years.Y2012 — это пространства имен, а не классы. - person Maya; 12.03.2013
comment
это нулевой указатель; Type.GetType(namespace.qualified.TypeName) работает, только если тип найден либо в mscorlib.dll, либо в текущей выполняемой сборке. Пожалуйста, проверьте свой код - person Kumar Shorav; 12.03.2013
comment
dEnvelope.InnerClass= Activator.CreateInstance(Type.GetType(dEnvelope.InnerClass)); - person Kumar Shorav; 12.03.2013
comment
Вы также можете использовать другой метод: Type myClassType = Type.GetType(TypeName,DllName); Просто проверьте через него. - person Kumar Shorav; 12.03.2013
comment
Чем этот комментарий отличается от моего кода выше, вы действительно читали вопрос? - person Maya; 12.03.2013
comment
Я прочитал вопрос - я говорю, что обратите внимание, что ошибка будет в строке dEnvelope.InnerClass= Activator.CreateInstance(Type.GetType(dEnvelope.InnerClass)); и изменить другим способом. Переменная dEnvelope не инициализируется. Дат ноль приближается. - person Kumar Shorav; 12.03.2013
comment
Мой вопрос явно связан с тем, что я получаю сообщение об ошибке при выполнении строки Activator.CreateInstance, и я не могу использовать TypenName, тип является динамическим - person Maya; 12.03.2013
comment
В вашем коде dEnvelope.InnerClass имеет значение null; который вы передаете в качестве параметра в Type.GetType(dEnvelope.InnerClass); Тут надо переодеться. Это ошибка. Методу GetType требуется значение строкового типа, равное null; - person Kumar Shorav; 12.03.2013