gpt4 book ai didi

c# - 创建一个只知道类名的对象?

转载 作者:可可西里 更新时间:2023-11-01 03:14:27 26 4
gpt4 key购买 nike

我有一组类,每个类都是不同的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

如何在只配置类名的情况下让它工作?将命名空间连接到类名以获得完整类型名称?还有其他有效的反射调用吗?

如果您认为这是无用的并且我希望配置包含完整的类型名称,我愿意接受该解决方案!只需提供说服我的理由即可。

(我不会从这个程序集/命名空间之外加载类型)

最佳答案

要么使用程序集限定名称,要么获取程序集并使用 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) 具有经常引起混淆的探测规则...它查看调用程序集和一些系统程序集 - 但不是所有已加载的程序集。

关于c# - 创建一个只知道类名的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/296251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com