首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个只知道类名的对象?

创建一个只知道类名的对象?
EN

Stack Overflow用户
提问于 2008-11-17 17:32:44
回答 4查看 37K关注 0票数 15

我有一组类,每个类都有一个不同的strategy来做相同的工作。

代码语言:javascript
复制
namespace BigCorp.SuperApp
{
    public class BaseClass { }
    public class ClassA : BaseClass { }
    public class ClassB : BaseClass { }
}

选择使用哪种策略是可配置的。我只想在app.config文件中配置类名'ClassB‘,而不是完整的类名'BigCorp.SuperApp.ClassB’。

代码语言:javascript
复制
<appConfig>
   <SuperAppConfig>
      <Handler name="ClassB" />
   </SuperAppConfig>
</appConfig>

但是,反射调用会失败,因为它们需要完整的类型名称,尤其是

代码语言:javascript
复制
Type t = Type.GetType("ClassB"); // results in t == null
BaseClass c = Activator.CreateInstance(t) as BaseClass; // fails

在仅配置类名的情况下,如何才能使其正常工作?是否将命名空间连接到类名称以获得完整的类型名称?有没有另一个可以工作的反射调用?

如果您认为这是无用的,而我希望配置包含完整的类型名称,那么我对此解决方案持开放态度!只要提供理由说服我就行了。

(我不会从此程序集/命名空间外部加载类型)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-17 18:24:23

由于您知道所有类都将来自相同的名称空间,因此只需配置一次并使用它:

代码语言:javascript
复制
<appConfig>
   <SuperAppConfig handlerNamespace="BigCorp.SuperApp">
      <Handler class="ClassB" />
   </SuperAppConfig>
</appConfig>

类编辑:我将名称改为,以便更好地表示该属性的含义。

票数 6
EN

Stack Overflow用户

发布于 2008-11-17 17:34:59

使用程序集限定名,或者获取程序集并使用Assembly.GetType(name)。在这种情况下,由于您需要配置文件中的类型,因此程序集限定是一种有效的方法-但因为您知道所有类型都在同一程序集中:

代码语言:javascript
复制
Assembly assembly = typeof(SomeKnownType).Assembly; // in the same assembly!
Type type = assembly.GetType(name); // full name - i.e. with namespace (perhaps concatenate)
object obj = Activator.CreateInstance(type);

静态Type.GetType(string)的探测规则经常会引起混淆……它查看调用程序集和一些系统程序集,但不是所有已加载的程序集。

票数 18
EN

Stack Overflow用户

发布于 2008-11-18 15:07:26

我将在应用程序配置中使用完整的类型名称。下面是一个稍微完整一点的示例,但仍然很琐碎

代码语言:javascript
复制
<SuperAppConfig>
   <ObjectConfig provider="BigCorp.SuperApp.ClassA">
      <add name="one" />
      <add name="two" />
   </ObjectConfig>
</SuperAppConfig>

和实际创建这个的工厂类

代码语言:javascript
复制
private static Assembly a = typeof(IFactoryObject).Assembly;
public static IFactoryObject CreateObject(String providerName)
{
    Type t = a.GetType(providerName)
    IFactoryObject o = Activator.CreateInstance(t) as IFactoryObject;
    return o;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/296251

复制
相关文章

相似问题

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