gpt4 book ai didi

.net - 调用 Assembly.GetTypes() 时如何防止 ReflectionTypeLoadException

转载 作者:行者123 更新时间:2023-12-03 04:55:43 25 4
gpt4 key购买 nike

我正在尝试使用类似于以下的代码扫描程序集以查找实现特定接口(interface)的类型:

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;
}

我的问题是,在某些情况下调用 asm.GetTypes() 时,例如,我收到 ReflectionTypeLoadException 。如果程序集包含引用当前不可用的程序集的类型。

就我而言,我对导致问题的类型不感兴趣。我正在搜索的类型不需要不可用的程序集。

问题是:是否可以以某种方式跳过/忽略导致异常的类型,但仍然处理程序集中包含的其他类型?

最佳答案

一种相当令人讨厌的方式是:

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 block - 我本人不太喜欢它在那里,但它可能最短的代码...

关于.net - 调用 Assembly.GetTypes() 时如何防止 ReflectionTypeLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7889228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com