获取仅在装配中定义的类型

时间:2012-10-14 19:52:36

标签: c# .net-4.0

  

可能重复:
  How to prevent ReflectionTypeLoadException when calling Assembly.GetTypes()

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

  

System.Reflection.ReflectionTypeLoadException:无法加载一个或   更多要求的类型。

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

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

e.g。替换

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

1 个答案:

答案 0 :(得分:9)

GetTypes仅获取程序集中定义的类型,但是,您可能无法加载它们,因为它们引用了尚未加载或无法找到的程序集中的类型。例如,如果您尝试加载从其他程序集中的类派生的类型,那么您将获得ReflectionTypeLoadException。您可以从异常对象的Types属性中获取加载的类型。请注意,对于无法加载的每种类型,都会有nullLoaderExceptions属性对每种类型都有例外。

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