首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在给定字符串名称的情况下实例化一个类?

如何在给定字符串名称的情况下实例化一个类?
EN

Stack Overflow用户
提问于 2010-02-12 04:46:26
回答 3查看 63.2K关注 0票数 80

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

我有一个字符串形式的子类名称。

除此之外..。

代码语言:javascript
复制
String childClassString;
MyAbstractClass myObject;

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-12 04:47:57

看看Activator.CreateInstance()。

代码语言:javascript
复制
myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");

代码语言:javascript
复制
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
票数 135
EN

Stack Overflow用户

发布于 2010-02-12 04:53:21

我相信这应该是可行的:

代码语言:javascript
复制
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);

第一个参数中的null默认为当前正在执行的程序集。有关更多参考,请访问:MSDN

编辑:忘记强制转换为MyAbstractClass

票数 23
EN

Stack Overflow用户

发布于 2017-04-03 06:58:21

我在实现这里的一些答案时遇到了一些困难,因为我试图实例化来自不同程序集的对象(但在相同的解决方案中)。所以我想我应该把我发现的东西发布出来。

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

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

现在,我发现上面关于在AssemblyName中使用typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName的建议实际上给了我错误,而且我不能让它工作。我会得到System.IO.FileLoadException (无法加载文件或程序集...)。

我所做的工作如下:

代码语言:javascript
复制
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2247598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档