我有一组类,每个类都有一个不同的strategy来做相同的工作。
namespace BigCorp.SuperApp
{
public class BaseClass { }
public class ClassA : BaseClass { }
public class ClassB : BaseClass { }
}选择使用哪种策略是可配置的。我只想在app.config文件中配置类名'ClassB‘,而不是完整的类名'BigCorp.SuperApp.ClassB’。
<appConfig>
<SuperAppConfig>
<Handler name="ClassB" />
</SuperAppConfig>
</appConfig>但是,反射调用会失败,因为它们需要完整的类型名称,尤其是
Type t = Type.GetType("ClassB"); // results in t == null
BaseClass c = Activator.CreateInstance(t) as BaseClass; // fails在仅配置类名的情况下,如何才能使其正常工作?是否将命名空间连接到类名称以获得完整的类型名称?有没有另一个可以工作的反射调用?
如果您认为这是无用的,而我希望配置包含完整的类型名称,那么我对此解决方案持开放态度!只要提供理由说服我就行了。
(我不会从此程序集/命名空间外部加载类型)
发布于 2008-11-17 18:24:23
由于您知道所有类都将来自相同的名称空间,因此只需配置一次并使用它:
<appConfig>
<SuperAppConfig handlerNamespace="BigCorp.SuperApp">
<Handler class="ClassB" />
</SuperAppConfig>
</appConfig>类编辑:我将名称改为,以便更好地表示该属性的含义。
发布于 2008-11-17 17:34:59
使用程序集限定名,或者获取程序集并使用Assembly.GetType(name)。在这种情况下,由于您需要配置文件中的类型,因此程序集限定是一种有效的方法-但因为您知道所有类型都在同一程序集中:
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)的探测规则经常会引起混淆……它查看调用程序集和一些系统程序集,但不是所有已加载的程序集。
发布于 2008-11-18 15:07:26
我将在应用程序配置中使用完整的类型名称。下面是一个稍微完整一点的示例,但仍然很琐碎
<SuperAppConfig>
<ObjectConfig provider="BigCorp.SuperApp.ClassA">
<add name="one" />
<add name="two" />
</ObjectConfig>
</SuperAppConfig>和实际创建这个的工厂类
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;
}https://stackoverflow.com/questions/296251
复制相似问题