Activator.CreateInstance()特定的类类型实例

时间:2013-03-17 13:19:40

标签: c# class types activator

此问题是this之前提出的问题的补充。

我的子类应该初始化,基类是列表类型

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未处理:无法从程序集'Something'加载类型'child2' 我怎么能改变这个? 我没有成功尝试其他一些选择。 (某些导致类的创建,但在添加时导致nullReferenceException)。

编辑:

好的,我将代码更改为:

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:(

2 个答案:

答案 0 :(得分:1)

可能它没有找到类型,因为类可能是命名空间。

我的意思是child2的类型名称可能不只是child2而是SomeNamespace.child2

除了这似乎是一个非常疯狂的模式,我建议在构造函数中使用baseClass

答案 1 :(得分:0)

您提供的代码甚至不会按预期编译或工作,因为: Activator.CreateInstance返回System.Runtime.Remoting.ObjectHandle,而不是您创建的类型。当然你需要把它投射到baseClass
除此之外,您需要在使用此方法时提供名称空间,如Danilel所建议。