首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单元测试项目中获取带有属性的程序集

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

Stack Overflow用户
提问于 2012-10-04 19:45:30
回答 2查看 2.9K关注 0票数 2

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

代码语言:javascript
复制
var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();

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

代码语言:javascript
复制
Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.ReflectionOnlyLoad(a.FullName).Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();

但这却造成了错误:

对通过ReflectionOnlyGetType加载的Type的自定义属性进行反思是非法的(参见Assembly.ReflectionOnly) --使用CustomAttributeData代替。

如果有人能教我怎么做,我会很感激的。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 20:12:10

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

试着做:

代码语言:javascript
复制
Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(a => Assembly.Load(a.FullName))
    .Where(a => a.
            .GetCustomAttributes(false)
            .OfType<AssemblyCategoryAttribute>()
            .Any())
    .ToList();

或者更好的是:

代码语言:javascript
复制
Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(Assembly.Load)
    .Where(a => a.IsDefined(typeof(AssemblyCategoryAttribute), false))
    .ToList();
票数 5
EN

Stack Overflow用户

发布于 2012-10-04 19:48:44

看看CustomAttributeData Class

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

这里有一个示例c#代码

代码语言:javascript
复制
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]));
}

在您的例子中,类似这样的情况(没有亲自尝试代码):

代码语言:javascript
复制
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();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12734724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档