我正在尝试使用类似于以下代码的程序集来扫描实现特定接口的类型的类型: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块中移出-我不是很热衷于自己在其中,但是它可能是最短的代码...
- 3 回答
- 0 关注
- 731 浏览
添加回答
举报
0/150
提交
取消