我搜索过高低,但我无法想出解决方案.
我需要使用如下代码从程序集中获取所有接口类型:
IEnumerable<Type> interfaces = _assembly.GetTypes().Where(x => x.IsInterface);
Run Code Online (Sandbox Code Playgroud)
问题是,对于某些程序集,我遇到以下错误:
无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.
我完全清楚为什么会发生这种情况(未加载依赖程序集),以及如果我想对特定程序集进行故障排除,它是如何解决的.在我的情况下,我不知道前面的组装(用户将选择它).
我想知道的是,是否有任何方法可以让代码继续通过任何无法检索的类型,并且仍然可以提取那些不会失败的代码.
Jef*_*dge 33
看起来这是一个令人烦恼的API,其异常是无法避免的(据我所知).
尝试这样的事情:
IEnumerable<Type> interfaces;
try
{
interfaces = _assembly.GetTypes().Where(x => x.IsInterface);
}
catch (ReflectionTypeLoadException ex)
{
interfaces = ex.Types.Where(x => x != null && x.IsInterface);
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
实际上,这太丑了,我可能会把它隐藏在某个地方.这必须是.NET Framework的一个非常古老的部分,因为我很确定他们现在不会像这样设计它.
private static IEnumerable<Type> GetTypesSafely(Assembly assembly)
{
try
{
return assembly.GetTypes();
}
catch(ReflectionTypeLoadException ex)
{
return ex.Types.Where(x => x != null);
}
}
...
IEnumberable<Type> interfaces = GetTypesSafely(_assembly).Where(x => x.IsInterface);
Run Code Online (Sandbox Code Playgroud)
如果您认为自己经常这样做,那么扩展方法可能更合适.
| 归档时间: |
|
| 查看次数: |
3957 次 |
| 最近记录: |