.NET 4中的自定义属性更改

时间:2010-06-01 17:43:49

标签: c# unit-testing attributes c#-4.0 custom-attributes

我最近将一个C#项目从.NET 3.5升级到了.NET 4.我有一个方法可以从给定的MethodBase实例列表中提取所有MSTest测试方法。它的身体看起来像这样:

return null == methods || methods.Count() == 0
    ? null
    : from method in methods
      let testAttribute = Attribute.GetCustomAttribute(method,
          typeof(TestMethodAttribute))
      where null != testAttribute
      select method;

这在.NET 3.5中有效,但是自从将项目升级到.NET 4后,即使给出包含标有[TestMethod]的方法的方法列表,此代码也会返回一个空列表。 .NET 4中的自定义属性是否发生了变化?

调试时,我发现测试方法的GetCustomAttributesData()结果给出了两个CustomAttributeData的列表,这些列表在Visual Studio 2010的“本地”窗口中描述为:

  1. Microsoft.VisualStudio.TestTools.UnitTesting.DeploymentItemAttribute("myDLL.dll")
  2. Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute() - 这就是我要找的东西
  3. 但是,当我在第二个GetType()实例上调用CustomAttributeData时,我得到{Name = "CustomAttributeData" FullName = "System.Reflection.CustomAttributeData"} System.Type {System.RuntimeType}。如何从TestMethodAttribute中获取CustomAttributeData,以便我可以从MethodBase列表中提取测试方法?

2 个答案:

答案 0 :(得分:2)

您是否尝试过使用

method.GetCustomAttributes(typeof(TestMethodAttribute), false)

代替?向目标询问自定义属性通常是我采用它的方式。

这是一个草率的例子:

using System;
using System.Linq;

[AttributeUsage(AttributeTargets.All)]
public class FooAttribute : Attribute {}

class Test
{
    static void Main()
    {
        var query = typeof(Test).GetMethods()
            .Where(method => method.GetCustomAttributes(
                              typeof(FooAttribute), false).Length != 0);

        foreach (var method in query)
        {
            Console.WriteLine(method);
        }
    }

    [Foo]
    public static void MethodWithAttribute1() {}

    [Foo]
    public static void MethodWithAttribute2() {}

    public static void MethodWithoutAttribute() {}

}

答案 1 :(得分:2)

我的愚蠢错误:我的测试方法提取方法位于引用Microsoft.VisualStudio.QualityTools.UnitTestFramework的类库项目中,因此它可以查找TestMethodAttribute作为自定义属性。当我将我的解决方案从VS 2008升级到VS 2010时,转换过程会自动将Microsoft.VisualStudio.QualityTools.UnitTestFramework,Version = 9.0.0.0 中的引用更新为Microsoft.VisualStudio.QualityTools.UnitTestFramework,Version =我的测试项目中 10.0.0.0 。但是,它没有更新我的类库项目中的引用,因此仍然指向旧的UnitTestFramework引用。当我将该项目更改为指向10.0.0.0库时,下面的代码按预期工作:

return null == methods || methods.Count() == 0
    ? null
    : from method in methods
      let testAttribute = Attribute.GetCustomAttribute(method,
          typeof(TestMethodAttribute))
      where null != testAttribute
      select method;

此外,一旦我更新了参考文献,代码Jon suggested也可以正常工作。