【问题标题】:Get Assemblies with Attribute in Unit Test Project在单元测试项目中获取具有属性的程序集
【发布时间】:2012-10-05 04:19:56
【问题描述】:

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

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

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

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

但这引发了错误:

反射通过加载的类型的自定义属性是非法的 ReflectionOnlyGetType(参见 Assembly.ReflectionOnly)——使用 而是使用 CustomAttributeData。

如果有人能告诉我如何做到这一点,我将不胜感激。谢谢

【问题讨论】:

    标签: c# unit-testing reflection


    【解决方案1】:

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

    试着做:

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

    或者更好:

    Assembly
        .GetExecutingAssembly()
        .GetReferencedAssemblies()
        .Select(Assembly.Load)
        .Where(a => a.IsDefined(typeof(AssemblyCategoryAttribute), false))
        .ToList();
    

    【讨论】:

    • 谢谢你的款待。我想我不应该总是相信我从互联网上复制的代码。当然除了这个哈哈。
    【解决方案2】:

    CustomAttributeData Class

    提供对加载到仅反射上下文中的程序集、模块、类型、成员和参数的自定义属性数据的访问。

    那里有一个示例 c# 代码

    public static void Main()
    {
        Assembly asm = Assembly.ReflectionOnlyLoad("Source");
        Type t = asm.GetType("Test");
        MethodInfo m = t.GetMethod("TestMethod");
        ParameterInfo[] p = m.GetParameters();
    
        Console.WriteLine("\r\nAttributes for assembly: '{0}'", asm);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm));
        Console.WriteLine("\r\nAttributes for type: '{0}'", t);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(t));
        Console.WriteLine("\r\nAttributes for member: '{0}'", m);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(m));
        Console.WriteLine("\r\nAttributes for parameter: '{0}'", p);
        ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0]));
    }
    

    在你的情况下是这样的(我自己没有尝试代码):

    var assemblies = Assembly.GetExecutingAssembly()
        .GetReferencedAssemblies()
        .Select(a => Assembly.ReflectionOnlyLoad(a.FullName))
        .Select(a => new 
          { Asm = a, 
            CustomAttributeDataList = CustomAttributeData.GetCustomAttributes(a)
          })
        .Where(x => x.CustomAttributeDataList.Any(y => y.AttributeType ==           
             type(AssemblyCategoryAttribute)))
        .Select(x => x.Asm)
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多