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
forAssemblyName
实际上给了我错误,我无法让它起作用。我将获得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();