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当我添加类到列表:
可能无法找到类型,因为类可能存在命名空间。
我的意思是child2
的类型名可能不仅仅是child2
,而是SomeNamespace.child2
。
Aside这似乎是一个非常疯狂的模式,我建议在构造函数中使用baseClass
。
你的代码,正如所提供的,甚至不能像预期的那样编译或工作也因为这个:Activator.CreateInstance
返回System.Runtime.Remoting.ObjectHandle
,而不是实际创建的类型。当然,您需要将其强制转换为baseClass
。
除此之外,正如daniel所建议的,在使用此方法时需要提供名称空间。