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

本文关键字:类型 实例 CreateInstance Activator | 更新日期: 2023-09-27 18:04:25

这个问题是对上一个问题的补充。

要初始化的子类和列表类型的基类

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

我的enum和管理器类

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);
    }
}

manager类已经更新为我之前问题的建议答案。然而,有些事情还是错了。在上面的情况下,我得到了错误:未处理typeloadeexception:无法从程序集" 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当我添加类到列表:

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

可能无法找到类型,因为类可能存在命名空间。

我的意思是child2的类型名可能不仅仅是child2,而是SomeNamespace.child2

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

你的代码,正如所提供的,甚至不能像预期的那样编译或工作也因为这个:Activator.CreateInstance返回System.Runtime.Remoting.ObjectHandle,而不是实际创建的类型。当然,您需要将其强制转换为baseClass
除此之外,正如daniel所建议的,在使用此方法时需要提供名称空间。