3

可能重复:
调用 Assembly.GetTypes() 时如何防止 ReflectionTypeLoadException

我想获取程序集中的所有类型。但是,我收到以下错误:

System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。

问题是我从中获取类型的程序集引用了另一个仅在生产环境中可用而不在单元测试环境中可用的程序集。

那么,有什么方法可以过滤 GetTypes 或类似的东西,只返回程序集中实际定义的类型而不获取类型加载异常?

例如替换

.Assembly.GetTypes().Where(t => t.Namespace.Equals(...
4

1 回答 1

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;    
}
于 2012-10-14T20:13:38.420 回答