Синтаксис для применения атрибута к анонимному методу? - PullRequest
5 голосов
/ 15 сентября 2009

Это связано с вопросом о атрибутах возвращаемого типа и анонимных классах , но затем о анонимных методах (или лямбдах), но, насколько я мог найти, этот точный вопрос не дает похоже, на стеке еще нет.

В коде для бизнес-объектов, который мы генерируем с использованием 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, но мне не повезло найти синтаксис, который позволял бы применять атрибуты к анонимным методам (или лямбдам). Я пропустил это, или это (в настоящее время?) Невозможно ...?

Ответы [ 3 ]

9 голосов
/ 15 сентября 2009

Вы не можете, к сожалению. Он указан на странице 401 спецификации языка C # 3.0:

Атрибуты могут быть указаны на глобальном область (для указания атрибутов на содержащий сборку или модуль) и для объявления типов (§9.6), объявления членов класса (§10.1.5), объявления членов интерфейса (§13.2), объявления членов-структур (§11.2), декларации enum-member (§14.3), декларации о доступе (§10.7.2), декларации доступа к событиям (§10.8.1), и списки формальных параметров (§10.6.1).

1 голос
/ 11 марта 2014

Поскольку ваша цель - исключить методы из покрытия кода, вы можете сделать это, создав файл .runsettings вместо добавления атрибута к методу:

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

1 голос
/ 15 сентября 2009

К сожалению, C # не позволяет применять атрибуты к анонимным методам.

Вы уверены, что действительно хотите применить атрибут DebuggerNonUserCode к этому анонимному методу? Метод - это код пользователя, и я думаю, что вы захотите в него войти, если потребуется.

...