如何实例化给定字符串名称的类?

我有一个抽象类,我想把它初始化为一个扩展它的类。

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

除了这个。

String childClassString;
MyAbstractClass myObject;


if (childClassString = "myExtenedObjectA")
myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
myObject = new ExtenedObjectB();

我该怎么做? 基本上我该怎么去掉 if 语句?

67477 次浏览

查看 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默认为当前正在执行的程序集

编辑: 忘记转到 MyAbstractClass

在这里实现一些答案有些困难,因为我试图从不同的程序集实例化一个对象(但是在同一个解决方案中)。所以我想把我发现的东西贴出来。

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

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

现在,我发现上面的建议使用 typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName作为 AssemblyName实际上给了我错误,我不能得到工作。我会得到 System.IO.FileLoadException(无法加载文件或汇编...)。

我的工作内容如下:

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