这与return type attributes和anonymous classes的问题有关,但是对于匿名方法(或lambdas),但到目前为止,我发现这个确切的问题似乎还没有在stackoverflow上。
在我们使用CodeSmith生成的业务实体的代码中,我们现在具有[DebuggerNonUserCode]
个属性,因此它们不计入代码覆盖率结果。不幸的是,生成的代码使用匿名方法,这些方法现在仍然显示在代码覆盖范围内,其名称类似于Class.<>c__DisplayClass3c
,因为这些方法实际上是由编译器处理的。
快速代码示例,更改名称和类型以保护无辜者,可以这么说:
public delegate T ReturnSomething<T>();
public static T SafeCall<T>(T whenNotSupported, ReturnSomething<T> method)
{
T result;
try
{
result = method();
}
catch (NotSupportedException)
{
result = whenNotSupported;
}
return result;
}
public static void CodeExample()
{
string foo = SafeCall<string>("OOPS!", delegate
{
//throw new NotSupportedException();
return "Ok";
});
}
有没有办法在这些方法上获得[DebuggerNonUserCode]
属性,以便我们可以从我们的代码覆盖率结果中生成的代码中删除名称错位的匿名方法名称?或者我们是否需要重写生成的代码以不再使用匿名方法?
将[DebuggerNonUserCode]
放在method
方法定义的SafeCall
参数上(在ReturnSomething<T>
参数类型之前)不能编译,也许不会完全按照我们的意愿行事就像它会。以下也不编译:
public static void CodeExample()
{
string foo = SafeCall<string>("OOPS!", [DebuggerNonUserCode] delegate
{
//throw new NotSupportedException();
return "Ok";
});
}
我试图快速浏览一下CSharp语言规范,但是没有运气找到允许将属性应用于匿名方法(或lambdas)的语法。我是否想念它,或者这个(目前?)不可能......?
答案 0 :(得分:9)
不幸的是,你不能。它列在C#3.0语言规范的第401页上:
可以在global指定属性 范围(指定上的属性) 包含装配或模块)和 类型声明(第9.6节), class-member-declarations(§10.1.5), interface-member-declarations(§13.2), struct-member-declarations(§11.2), 枚举成员声明(§14.3), 访问者声明(第10.7.2节), 事件访问器声明(第10.8.1节), 和形式参数列表(§10.6.1)。
答案 1 :(得分:1)
不幸的是,C#不允许将属性应用于匿名方法。
您确定要将DebuggerNonUserCode
属性应用于此匿名方法吗?方法是用户代码,如果需要的话,我认为您希望能够进入它。
答案 2 :(得分:1)
由于您的目标是从代码覆盖率中排除方法,您可以通过创建.runsettings文件而不是向方法添加属性来实现此目的: