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

swe*_*tfa 3 c# .net-4.0

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

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

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

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

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

例如替换

.Assembly.GetTypes().Where(t => t.Namespace.Equals(...
Run Code Online (Sandbox Code Playgroud)

Mik*_*ray 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;    
}
Run Code Online (Sandbox Code Playgroud)

  • @MohammadGoudarzi没有办法"没有得到类型加载异常"你只能抓住它获取你能够加载的类型. (4认同)
  • @MohammadGoudarzi它也不起作用.事实上它没有能力恢复和继续,因为它抛出一个`FileNotFoundException`,你不知道可以或不能加载什么类型. (2认同)