我有一个抽象类,我想把它初始化为一个扩展它的类。
我有一个字符串形式的子类名称。
除此之外..。
String childClassString;
MyAbstractClass myObject;
if (childClassString = "myExtenedObjectA")
myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
myObject = new ExtenedObjectB();
我该怎么做呢?基本上,我该如何摆脱这里的if语句呢?
发布于 2010-02-12 04:47:57
看看Activator.CreateInstance()。
myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");
或
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
发布于 2010-02-12 04:53:21
我相信这应该是可行的:
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);
第一个参数中的null
默认为当前正在执行的程序集。有关更多参考,请访问:MSDN
编辑:忘记强制转换为MyAbstractClass
发布于 2017-04-03 06:58:21
我在实现这里的一些答案时遇到了一些困难,因为我试图实例化来自不同程序集的对象(但在相同的解决方案中)。所以我想我应该把我发现的东西发布出来。
首先,Activator.CreateInstance
方法有几个重载。如果只调用Activator.CreateInstance(Type.GetType("MyObj"))
,则假定对象是在当前程序集中定义的,并且它返回一个MyObj
。
如果您按照这里的答案中的建议调用它:Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
,那么它将返回一个ObjectHandle
,并且您需要对它调用Unwrap()
来获取您的对象。当尝试调用在不同程序集中定义的方法时,此重载非常有用(顺便说一句,您可以在当前程序集中使用此重载,只需将AssemblyName
参数保留为空)。
现在,我发现上面关于在AssemblyName
中使用typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
的建议实际上给了我错误,而且我不能让它工作。我会得到System.IO.FileLoadException
(无法加载文件或程序集...)。
我所做的工作如下:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
https://stackoverflow.com/questions/2247598
复制相似问题