如何根据字符串名称实例化一个类?

我有一个抽象类,我想把它推广到一个扩展它的类。

我将子类名称作为字符串。

除此以外…

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

我在这里实现一些答案时遇到了一些困难,因为我试图从不同的程序集中实例化一个对象(但是在同一个解决方案中)。 所以我想我会发布我发现的工作。

首先, Activator.CreateInstance方法有几个重载。 如果只调用Activator.CreateInstance(Type.GetType("MyObj")) ,则假定该对象在当前程序MyObj定义,并返回MyObj

如果你按照这里的答案中的建议调用它: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName) ,然后它返回一个ObjectHandle ,你需要在它上面调用Unwrap()来获取你的对象。 当尝试调用在不同程序集中定义的方法时,此重载很有用(顺便说一句,您可以在当前程序集中使用此重载,只需将AssemblyName参数保留为null)。

现在,我发现上面使用typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName for AssemblyName实际上给了我错误,我无法typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName工作。 我得到System.IO.FileLoadException (无法加载文件或程序集……)。

我做的工作如下:

 var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject"); MyObject obj = (MyObject)container.Unwrap(); obj.DoStuff();