gpt4 book ai didi

c# - 为什么我不能从其他程序集中加载类?

转载 作者:行者123 更新时间:2023-11-30 22:27:53 26 4
gpt4 key购买 nike

在我的 MVC 项目的 web.config 中,我有这个:

<appSettings>
<add key="MembershipRepository" value="Repo.MembershipRepository"/>
</appSettings>

我有这样的代码:

var appSettings = ConfigurationManager.AppSettings; 
string membershipRepositoryClassName = appSettings["MembershipRepository"];
Type membershipRepositoryType = Type.GetType(membershipRepositoryClassName);
IMembershipRepository repository = (IMembershipRepository)Activator.CreateInstance(membershipRepositoryType);

假设,包含web.config 的Web 应用程序在程序集Web 中。我给出的代码段在汇编Lib中。类 MembershipRepository 在程序集 Repo 中。Web 引用了 LibRepoLib 没有引用任何其他程序集(它可能被引用为 dll)。Repo 可能引用也可能不引用 Lib

我将 membershipRepositoryType 设置为 null。我知道也许我需要指定 MembershipRepository 所在的程序集。一种方法是在配置中指定程序集名称(如 this )。但我认为应该有一些其他的方法。否则如何加载其他类只从配置文件中获取类名?例如,MembershipProvider 类可以很好地从其他程序集中加载。

我怎样才能做到这一点。或者如果我不能,为什么我不能?

最佳答案

来自 Type.GetType(String) 的 MSDN 库文档:

typeName: The assembly-qualified name of the type to get. See AssemblyQualifiedName. If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.

最后一句话解释了为什么有时仅指定类名时它会起作用:如果执行代码在 Repo 中,那么您只需指定 MembershipProvider 即可.但我建议您为了清楚(以及性能)起见,避免这种行为并始终指定程序集名称。或者,如果您已经有对包含您的类型的 Assembly 的引用,那么您可以调用 Assembly.GetType相反。

不过,如果您真的遇到不知道哪个程序集包含您的类型的情况,那么您可以在当前 AppDomain 中搜索所有已加载的程序集,并尝试在每个程序集上调用 Assembly.GetType :

Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(assembly => assembly.GetType(typeName))
.First(t => t != null);

关于c# - 为什么我不能从其他程序集中加载类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072607/

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