可能重复:
How to prevent ReflectionTypeLoadException when calling Assembly.GetTypes()
我想获得一个程序集中的所有类型。但是,我收到以下错误:
System.Reflection.ReflectionTypeLoadException:无法加载一个或 更多要求的类型。
问题是我获得类型的程序集是引用另一个程序集,该程序集仅在生产环境中可用,而不是在单元测试环境中。
那么,有没有什么方法可以过滤GetTypes或类似的东西只返回程序集中实际定义的类型而不是类型加载异常?
e.g。替换
.Assembly.GetTypes().Where(t => t.Namespace.Equals(...
答案 0 :(得分:9)
GetTypes
仅获取程序集中定义的类型,但是,您可能无法加载它们,因为它们引用了尚未加载或无法找到的程序集中的类型。例如,如果您尝试加载从其他程序集中的类派生的类型,那么您将获得ReflectionTypeLoadException
。您可以从异常对象的Types
属性中获取加载的类型。请注意,对于无法加载的每种类型,都会有null
,LoaderExceptions
属性对每种类型都有例外。
public static Type[] GetTypesLoaded(Assembly assembly)
{
Type[] types;
try
{
types = assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => t != null).ToArray();
}
return types;
}