2009-09-15 7 views
5

Jest to związane z pytaniem o return type attributes i anonymous classes, ale w przypadku anonimowych metod (lub lambdas), ale o ile mogę znaleźć to dokładne pytanie nie wydaje się jeszcze na stackoverflow.Składnia dla zastosowania atrybutu do anonimowej metody?

W kodzie dla podmiotów gospodarczych, które generujemy za pomocą CodeSmith mamy teraz atrybuty [DebuggerNonUserCode], więc nie liczą się w wynikach zasięgu kodu. Niestety, wygenerowany kod wykorzystuje anonimowe metody, które są nadal wyświetlane w pokryciu kodu o nazwach takich jak Class.<>c__DisplayClass3c ze względu na sposób, w jaki są one obsługiwane przez kompilator.

Krótki przykład kodu, o nazwach i typach zmienione w celu ochrony niewinnych, że tak powiem:

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

Czy istnieje sposób, aby uzyskać [DebuggerNonUserCode] atrybuty dotyczące tych metod, więc możemy pozbyć się z nazwy-zniekształcone anonimowe nazwy metod z naszego wygenerowanego kodu z naszych wyników pokrycia kodu? Czy musimy przepisać wygenerowany kod, aby nie używać już metod anonimowych?

Umieszczenie [DebuggerNonUserCode] od parametru definicji SafeCall metody (przed typu ReturnSomething<T> parametrów) nie skompilować method a może nie zrobi dokładnie to, co chcielibyśmy, jeśli to zrobi. Dodaje również nie kompiluje:

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

Próbowałem rzucić okiem na CSharp specyfikacji języka, ale nie miał szczęścia znalezienia składni, który pozwoliłby stosowania atrybutów do metod anonimowych (lub lambda) . Czy tęskniłem za tym, czy jest to (obecnie?) Niemożliwe ...?

+0

nie sądzę otrzyma wysoki priorytet (jeśli kiedykolwiek zostanie zrobione), ale dodałem sugestię do MS Connect na https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 489925 – peSHIr

Odpowiedz

9

Niestety nie można. Jest to podano na stronie 401 w opisie C# 3.0 języka:

atrybuty mogą być określone na poziomie globalnym zakresie (w celu określenia atrybutów na zawierające zespół lub moduł) oraz TYPU deklaracji (§9.6) , deklaracje członków klasy (§10.1.5), deklaracje członków interfejsu (§13.2), deklaracje składowe członków (§ 11.2), deklaracje członków-członków (§14.3), accessor- deklaracje (§10.7.2), zdarzenia-accessor-deklaracje (§10.8.1), oraz listy parametrów formalnych (§10.6.1).

+0

Dzięki, to referencja, której szukałem. :-( – peSHIr

1

Niestety C# nie zezwala na stosowanie atrybutów do metod anonimowych.

Czy na pewno chcesz zastosować atrybut DebuggerNonUserCode w tej anonimowej metodzie? Jest to kod użytkownika, który powinien być w stanie go wprowadzić, jeśli zajdzie taka potrzeba.

+0

Tak jak powiedziałem, metoda SafeCall jest również wywoływana w wygenerowanym kodzie CodeSmith. Tam chcielibyśmy umieścić "[DebuggerNonUserCode]" na anonimowej metodzie, tak. – peSHIr