为了账号安全,请及时绑定邮箱和手机立即绑定

调用Assembly.GetTypes()时如何防止ReflectionTypeLoad

调用Assembly.GetTypes()时如何防止ReflectionTypeLoad

明月笑刀无情 2019-10-17 14:16:58
我正在尝试使用类似于以下代码的程序集来扫描实现特定接口的类型的类型:public List<Type> FindTypesImplementing<T>(string assemblyPath){    var matchingTypes = new List<Type>();    var asm = Assembly.LoadFrom(assemblyPath);    foreach (var t in asm.GetTypes())    {        if (typeof(T).IsAssignableFrom(t))            matchingTypes.Add(t);    }    return matchingTypes;}我的问题是,在某些情况下ReflectionTypeLoadException调用时会asm.GetTypes()出现,例如,如果程序集包含引用当前不可用的程序集的类型。就我而言,我对引起问题的类型不感兴趣。我要搜索的类型不需要不可用的程序集。问题是:是否可以以某种方式跳过/忽略导致异常但仍处理程序集中包含的其他类型的类型?
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

一种相当讨厌的方式是:


Type[] types;

try

{

    types = asm.GetTypes();

}

catch (ReflectionTypeLoadException e)

{

    types = e.Types;

}

foreach (var t in types.Where(t => t != null))

{

    ...

}

但是绝对必须这样做。您可以使用扩展方法在“客户端”代码中使其更美观:


public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)

{

    // TODO: Argument validation

    try

    {

        return assembly.GetTypes();

    }

    catch (ReflectionTypeLoadException e)

    {

        return e.Types.Where(t => t != null);

    }

}

您可能希望将return语句从catch块中移出-我不是很热衷于自己在其中,但是它可能是最短的代码...


查看完整回答
反对 回复 2019-10-17
?
长风秋雁

TA贡献1757条经验 获得超7个赞

就我而言,相同的问题是由应用程序文件夹中存在不需要的程序集引起的。尝试清除Bin文件夹并重建应用程序。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 731 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信