gpt4 book ai didi

c# - 为什么 Type.GetType() 有效而 Assembly.GetType() 无效?

转载 作者:太空狗 更新时间:2023-10-29 21:14:17 24 4
gpt4 key购买 nike

我试图在运行时从程序集列表中定位一个类型;我的代码是这样的:

foreach (Assembly assembly in assembliesToSearch)
{
Type t = assembly.GetType(assemblyName);
if (t != null)
{
return t;
}
}

,我遇到的问题是 t 总是显示为 null。在 VS2010 中使用调试器和中间窗口时,我在循环中放置断点时注意到以下内容:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

工作正常,但是

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

不会(当程序集是我知道的包含我正在寻找的类的程序集时 - 在调试器中,我可以监视 assembly.GetTypes(),浏览到我试图实例化的类,并调用 assembly.GetType("MyNamespace.MyClass, MyNamespace")).

有谁知道为什么使用 Type.GetType() 搜索所有程序集有效,但使用 assembly.GetType() 搜索我知道包含类型的程序集却不行?

最佳答案

来自这两种方法的 MSDN 文档,Type.GetType()需要一个类型的程序集限定名称Assembly.GetType()需要类型的全名。这些不是一回事。

typeof(MyNamespace.MyClass).AssemblyQualifiedName 计算出一个类型的程序集限定名称(类似于 MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral),因此它不适用于 Assembly.GetType() 调用,该调用需要格式为 MyNamespace.MyClass 的字符串。

这可能是因为当您将程序集限定名称传递给 Assembly.GetType() 调用时,它会在程序集中查找全名与您匹配的类型已提供。它找不到一个,所以你得到一个 null 返回。 Type.GetType() 调用不是这种情况,因为它期望获得一个类型的程序集限定名称,并且可以定位程序集和类型。


注意事项:

如果您像您所说的那样“尝试在运行时从程序集列表中定位类型”,那么您最好对列表中的每个程序集使用 Assembly.GetType() 调用并传入类型的全名。 Type.GetType() 很可能会使用当前程序集的引用来解析类型,因此如果该类型存在于不是引用的程序集中,则不会找到它。

关于c# - 为什么 Type.GetType() 有效而 Assembly.GetType() 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382084/

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