我试图扫描组件,用于执行使用类似于此代码的特定接口类型:如何防止ReflectionTypeLoadException调用Assembly.GetTypes()时
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()
时,例如如果程序集包含引用当前不可用的程序集的类型。
就我而言,我对导致问题的类型不感兴趣。我正在搜索的类型不需要不可用的程序集。
问题是:是否有可能以某种方式跳过/忽略导致异常的类型,但仍处理包含在程序集中的其他类型?
它可能比你想要的重写更多,但MEF为你提供了类似的功能。只需使用指定它实现的接口的[Export]标记标记每个类。然后,您只能导入那些您当时感兴趣的接口。 –
@德鲁,感谢您的评论。我正在考虑使用MEF,但想看看是否有另一种更便宜的解决方案。 – M4N
为插件类工厂提供一个知名的名称,以便您直接使用Activator.CreateInstance()是一种简单的解决方法。尽管如此,如果您现在由于组件解决问题而出现此异常,那么稍后您可能会得到它。 –