我在类库中有一个方法,它扫描所有加载的程序集,以查找实现某个接口的类型,而不是获取实现某个接口的所有类型。
var type = typeof(IMyInteraface);
var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
在将类库安装到项目中时,我偶尔会遇到这样的FileNotFoundException
:
无法加载文件或程序集'AAA.BBB '。CCC, Version=1.2.3.4, Culture=neutral, PublicKeyToken=abcdef0123456789a'或其依赖项之一。系统找不到指定的文件
我想重写LINQ查询成一些更安全的错误。出于我的目的,如果不能加载程序集,那么我不必担心尝试加载属于它的任何类型。这是如何做到的呢?
您可以将LINQ分解为嵌套的foreach
循环,并添加许多try-catch块,并忽略任何给您错误的汇编和任何类型。
var interfaceType = typeof(IMyInterface);
var types = new List<Type>();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
try {
foreach (var type in assembly.GetTypes()) {
try {
if (interfaceType.IsAssignableFrom(type))
types.Add(type);
} catch (FileNotFoundException) {}
}
} catch (FileNotFoundException) {}
}