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