我最近将一个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的“本地”窗口中描述为:
Microsoft.VisualStudio.TestTools.UnitTesting.DeploymentItemAttribute("myDLL.dll")
Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()
- 这就是我要找的东西但是,当我在第二个GetType()
实例上调用CustomAttributeData
时,我得到{Name = "CustomAttributeData" FullName = "System.Reflection.CustomAttributeData"} System.Type {System.RuntimeType}
。如何从TestMethodAttribute
中获取CustomAttributeData
,以便我可以从MethodBase
列表中提取测试方法?
答案 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也可以正常工作。