【问题标题】:Syntax for applying an attribute to an anonymous method?将属性应用于匿名方法的语法?
【发布时间】:2009-09-15 12:19:46
【问题描述】:

这与关于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] 放在SafeCall 方法定义的method 参数上(在ReturnSomething&lt;T&gt; 参数类型之前)不会编译,并且可能不会完全符合我们的要求。以下内容也无法编译:

    public static void CodeExample()
    {
        string foo = SafeCall<string>("OOPS!", [DebuggerNonUserCode] delegate
        {
            //throw new NotSupportedException();
            return "Ok";
        });
    }

我试图快速浏览一下 CSharp 语言规范,但没有找到允许将属性应用于匿名方法(或 lambdas)的语法。我错过了,还是这(目前?)不可能......?

【问题讨论】:

标签: .net attributes delegates


【解决方案1】:

很遗憾,你不能。它列在 C#3.0 语言规范的第 401 页:

属性可以在全局指定 范围(指定属性 包含组件或模块)和 类型声明(§9.6), 类成员声明(§10.1.5), 接口成员声明(§13.2), 结构成员声明(§11.2), 枚举成员声明(§14.3), 访问器声明(§10.7.2), 事件访问器声明(§10.8.1), 和形式参数列表(§10.6.1)。

【讨论】:

  • 谢谢,这就是我要找的参考资料。 :-(
【解决方案2】:

不幸的是,C# 不允许将属性应用于匿名方法。

您确定要为这个匿名方法应用DebuggerNonUserCode 属性吗?该方法 用户代码,我认为如果需要,您可能希望能够进入它。

【讨论】:

  • 就像我说的,在 CodeSmith 生成的代码中也会调用 SafeCall 方法。我们想在匿名方法上加上[DebuggerNonUserCode],是的。
【解决方案3】:

由于您的目标是从代码覆盖率中排除方法,因此您可以通过创建 .runsettings 文件而不是向方法添加属性来实现:

http://msdn.microsoft.com/en-us/library/jj159530.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2013-09-02
    • 2023-03-19
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    相关资源
    最近更新 更多