这与有关return type attributesanonymous 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语言规范,但没有找到一个可以将属性应用于匿名方法(或lambda)的语法的运气。我是否想念它,或者这(当前?)是不可能的...?

最佳答案

不幸的是,您不能。它在C#3.0语言规范的第401页上列出:


可以在全局指定属性
范围(用于指定
包含组件或模块)和
类型声明(第9.6节),
类成员声明(第10.1.5节),
接口成员声明(第13.2节),
struct-member-declarations(第11.2节),
枚举成员声明(第14.3节),
访问者声明(第10.7.2节),
事件访问者声明(第10.8.1节),
和形式参数列表(第10.6.1节)。

07-24 09:38
查看更多