在单元测试项目中获取具有属性的程序集

nfp*_*lee 2 c# reflection unit-testing

是否可以获取应用了自定义属性的所有引用程序集(在单元测试项目中).我使用以下代码使我的应用程序成功运行:

var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();
Run Code Online (Sandbox Code Playgroud)

但是System.Web.Compilation.BuildManager在我的测试项目中不起作用,所以我尝试了:

Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.ReflectionOnlyLoad(a.FullName).Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();
Run Code Online (Sandbox Code Playgroud)

但这引发了错误:

反映通过ReflectionOnlyGetType加载的Type的自定义属性是非法的(请参阅Assembly.ReflectionOnly) - 请改用CustomAttributeData.

如果有人能告诉我怎么做,我会很感激.谢谢

Jam*_*tis 5

由于您正在获取当前正在执行的程序集的引用程序集,因此没有理由进行仅反射加载. ReflectionOnlyLoad当你想要查看程序集但不实际执行它们时.由于这些程序集正在由当前正在执行的程序集引用,因此最有可能或者将要加载到执行上下文中.

试着做:

Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(a => Assembly.Load(a.FullName))
    .Where(a => a.
            .GetCustomAttributes(false)
            .OfType<AssemblyCategoryAttribute>()
            .Any())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(Assembly.Load)
    .Where(a => a.IsDefined(typeof(AssemblyCategoryAttribute), false))
    .ToList();
Run Code Online (Sandbox Code Playgroud)