代码之家  ›  专栏  ›  技术社区  ›  peSHIr

将属性应用于匿名方法的语法?

  •  5
  • peSHIr  · 技术社区  · 15 年前

    这是关于 return type attributes anonymous classes

    在使用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";
            });
        }
    

    有什么方法可以到达吗 [调试器非用户代码] 属性,这样我们就可以从代码覆盖率结果中从生成的代码中去除名称被破坏的匿名方法名称了?还是我们需要重写生成的代码,不再使用匿名方法?

    [调试器非用户代码] method 参数 SafeCall 方法定义(在 ReturnSomething<T>

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

    3 回复  |  直到 7 年前
        1
  •  9
  •   Razzie    15 年前

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

    范围(用于指定 包含组件或模块)和 类型声明(§9.6), 接口成员声明(§13.2), 结构成员声明(§11.2), 枚举成员声明(§14.3), 事件访问器声明(§10.8.1), 和正式参数列表(§10.6.1)。

        2
  •  1
  •   Andrew Hare    15 年前

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

    你确定你真的要申请 DebuggerNonUserCode 该匿名方法的属性?方法 用户代码,我想如果需要的话,你会希望能够进入它。

        3
  •  1
  •   schaneville    10 年前

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

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