【发布时间】:2009-09-15 12:19:46
【问题描述】:
这与关于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] 放在SafeCall 方法定义的method 参数上(在ReturnSomething<T> 参数类型之前)不会编译,并且可能不会完全符合我们的要求。以下内容也无法编译:
public static void CodeExample()
{
string foo = SafeCall<string>("OOPS!", [DebuggerNonUserCode] delegate
{
//throw new NotSupportedException();
return "Ok";
});
}
我试图快速浏览一下 CSharp 语言规范,但没有找到允许将属性应用于匿名方法(或 lambdas)的语法。我错过了,还是这(目前?)不可能......?
【问题讨论】:
-
不要认为这会得到高优先级(如果它会完成的话),但我已将建议添加到 MS Connect connect.microsoft.com/VisualStudio/feedback/…
标签: .net attributes delegates