我试图从程序集列表中找到运行时的类型; 我的代码是这样的:
foreach (Assembly assembly in assembliesToSearch)
{
Type t = assembly.GetType(assemblyName);
if (t != null)
{
return t;
}
}
Run Code Online (Sandbox Code Playgroud)
,我遇到的问题是t总是出现为null.在VS2010中使用调试器和中间窗口,我在循环中放置一个断点时注意到以下内容:
Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
Run Code Online (Sandbox Code Playgroud)
工作正常,但是
assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)
Run Code Online (Sandbox Code Playgroud)
没有(当程序集是我知道包含我正在寻找的类的程序集 - 在调试器中,我可以在assembly.GetTypes()上查看,浏览到我试图实例化的类,并调用程序集.GetType("MyNamespace.MyClass,MyNamespace")).
有谁知道为什么使用Type.GetType()搜索所有程序集,但搜索我知道的程序集包含使用assembly.GetType()的类型不起作用?
adr*_*nks 10
从这两种方法的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()很可能会使用当前程序集的引用来解析类型,因此如果类型存在于不是引用的程序集中,则不会找到它.
| 归档时间: |
|
| 查看次数: |
3289 次 |
| 最近记录: |