c#从string实例化类
我有一个抽象类,我想把它扩展到一个扩展它的类。
我有孩子类名string。
除此之外…
String childClassString; MyAbstractClass myObject; if (childClassString = "myExtenedObjectA") myObject = new ExtenedObjectA(); if (childClassString = "myExtenedObjectB") myObject = new ExtenedObjectB();
我该怎么做? 基本上我怎么摆脱这里的if语句?
看看Activator.CreateInstance()。
myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");
要么
var type = Type.GetType("MyFullyQualifiedTypeName"); var myObject = (MyAbstractClass)Activator.CreateInstance(type);
我相信这应该工作:
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);
第一个参数中的null
默认为当前正在执行的程序集。 有关更多参考: MSDN
编辑:忘了投到MyAbstractClass
我在这里实现一些答案时有一些困难,因为我试图从一个不同的程序集中实例化一个对象(但在同一个解决scheme中)。 所以我想我会张贴我发现的工作。
首先, Activator.CreateInstance
方法有几个重载。 如果你只是调用Activator.CreateInstance(Type.GetType("MyObj"))
,假定对象在当前程序MyObj
定义,并返回一个MyObj
。
如果按照这里的答案中的build议调用它: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
,那么它将返回一个ObjectHandle
,并且需要调用Unwrap()
来获取对象。 当尝试调用不同程序集中定义的方法时,此重载非常有用(顺便说一句,您可以在当前程序集中使用此重载,只需将AssemblyName
参数保留为空)。
现在,我发现上面的build议使用typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
为AssemblyName
实际上给了我错误,我不能得到这个工作。 我会得到System.IO.FileLoadException
(无法加载文件或程序集…)。
我所做的工作如下:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject"); MyObject obj = (MyObject)container.Unwrap(); obj.DoStuff();