C# 给定一个类的字符串名,如何实例化该类?

C# 给定一个类的字符串名,如何实例化该类?,c#,reflection,polymorphism,C#,Reflection,Polymorphism,我有一个抽象类,我想将它初始化为一个扩展它的类 我将子类名称作为字符串 除此之外 String childClassString; MyAbstractClass myObject; if (childClassString = "myExtenedObjectA") myObject = new ExtenedObjectA(); if (childClassString = "myExtenedObjectB") myObject = new ExtenedObjectB(

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

我将子类名称作为字符串

除此之外

String childClassString;
MyAbstractClass myObject;

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

我该怎么做?基本上,我如何在这里摆脱if语句?

看看Activator.CreateInstance()


我认为这应该是可行的:

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
参数保留为null)

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

我的工作内容如下:

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

工作得很有魅力。如果任何人在获取完全限定名时遇到问题,这段代码将非常有用'string typex=typeof(classname).AssemblyQualifiedName;即使其
typeName
参数的
GetType
文档中显示了“类型的程序集限定名”,实际上也不需要包含程序集名称。如果类型在调用程序集中,则仅命名空间限定的类型名就足够了。这是否回答了您的问题?
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();