2013-03-17 3 views
0

Этот вопрос является дополнением к this ранее задаваемым вопросам.Activator.CreateInstance() конкретный экземпляр класса

Мой ребенок классов, которые должны быть инициализированных и базовый класс, который будет тип списка

abstract public class baseClass 
{ 
    public baseClass() 
    { 
    } 
} 

public class child1 : baseClass 
{ 
    public child1() : base 
    { 
    } 
} 

public class child2 : baseClass 
{ 
    public child2() : base 
    { 
    } 
} 

Мой перечисление и менеджер класса

public enum ClassType 
{ 
    child1, 
    child2 
} 

public class Manager 
{ 
    private List<baseClass> _children; 

    public void Initialise(ClassType type) 
    { 
     var temp = Activator.CreateInstance(null, type.ToString()); 
     //null = assembly which means this assembly 
     _children.Add(temp); 
    } 
} 

Класс менеджер был обновлен в предлагаемый ответ из моего предыдущего вопроса. Однако что-то еще не так. В приведенном выше случае я получаю сообщение об ошибке: TypeLoadException был необработанным: Не удалось загрузить тип 'child2' из сборки 'Something' Как я могу это изменить? Я попробовал другие варианты без успеха. (некоторые из них приводят к созданию класса, но при добавлении приводит к исключению nullReferenceException).

EDIT:

Хорошо я изменил код в:

string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 
Type objType = Type.GetType(string.Format("{0}.{1},{0}", assemblyName, type.ToString())); 
var temp = (baseClass)Activator.CreateInstance(objType, 1); 
// 1 is the parameter I need to add to the constructor. 
_children.Add(temp); 

теперь я получаю правильный класс, созданный, но я получаю NullReferenceException, когда я добавить класс к списку :(

ответ

1

Вероятно, он не находит этот тип, потому что классы потенциально именуются.

Я имею в виду, что тип ame для child2 может быть не просто child2, а скорее SomeNamespace.child2.

Пространство Это похоже на действительно сумасшедший шаблон, и я бы посоветовал вместо этого использовать конструктор baseClass.

+0

Возможно, пожалуйста, проясните это? – Danahi

+0

спасибо, все, что я должен исправить, теперь является пустой ссылкой, есть ли у вас ключ? – Danahi

0

Ваш код, как предусмотрено, обычно не компилируется или работает должным образом. Из-за этого: Activator.CreateInstance возвращает System.Runtime.Remoting.ObjectHandle, а не тип, который вы создали. Конечно, вам нужно бросить его на baseClass.
Кроме того, вам необходимо указать пространство имен при использовании этого метода, как предлагает Даниэл.

Смежные вопросы