2011-07-25 14 views
12

Utworzono tę klasę adnotacji
Ten przykład może nie mieć sensu, ponieważ zawsze będzie generował wyjątek, ale nadal go używam, ponieważ próbuję wyjaśnić, jakie jest moje pytanie. Moja adnotacja nigdy nie jest wywoływana z jakichś powodów żadnych rozwiązań?C# - Korzystanie z niestandardowych adnotacji?

public class AuthenticationRequired : System.Attribute 
{ 
    public AuthenticationRequired() 
    { 
     // My break point never gets hit why? 
     throw new Exception("Throw this to see if annotation works or not"); 
    } 
} 

[AuthenticationRequired] 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // My break point get here 
} 
+4

Tutaj masz jak uzyskać dostęp i odczytać niestandardowe adnotacji: http://msdn.microsoft.com/en-us/library /z919e8tw.aspx#Y109 –

Odpowiedz

22

Moja adnotacja nigdy nie jest wywoływana z jakichś powodów żadnych rozwiązań?

To rodzaj niezrozumienia atrybutów. Atrybuty efektywnie istnieją, aby dodać metadane do pewnych części kodu (klasy, właściwości, pola, metody, parametry itd.) Kompilator pobiera informacje z atrybutu i umieszcza je w IL, które wypluwa po zakończeniu jedzenia twojego źródła kod.

Atrybuty same z siebie nic nie robią, chyba że ktoś je spożywa. Oznacza to, że ktoś musi odkryć twój atrybut, a następnie podjąć na nim działanie. Siedzą w IL waszego zgromadzenia, ale nic nie robią, chyba że ktoś je znajdzie i działa na nich. Dopiero gdy to zrobią, instancja atrybutu zostanie utworzona. Typowym sposobem na to jest użycie refleksji.

Aby uzyskać atrybuty w czasie wykonywania, trzeba powiedzieć coś

var attributes = typeof(Foo) 
        .GetMethod("Window_Loaded") 
        .GetCustomAttributes(typeof(AuthenticationRequired), true) 
        .Cast<AuthenticationRequired>(); 

foreach(var attribute in attributes) { 
    Console.WriteLine(attribute.ToString()); 
} 
+0

Przepraszam, jeśli to się nie skompiluje, nie mam przy sobie kompilatora. – jason

+0

Dzięki za odpowiedź, czy można to zrobić tak, że gdy metoda ma określony atrybut, wywoływany jest określony blok kodu? Czy byłoby to uznane za złą praktykę? Powiedzmy, że chcę, aby każda metoda z atrybutem "Log" rejestrowała czas. Próbuję użyć tej metody, aby ponownie użyć kodu – aryaxt

+2

@aryaxt: Tak, jest to możliwe. Ale potrzebujesz czegoś, żeby to zbudować (możesz zrobić to sam, ale są dostępne narzędzia, które zrobią to za ciebie). To, czego szukasz, to coś, co dynamicznie zbuduje dla ciebie proxy. Obawy te są często nazywane zagadnieniami przekrojowymi, a tego typu programowanie nazywa się programowaniem aspektowym. Jeśli spojrzysz na możliwości przechwytywania w Castle Windsor, na przykład, zobaczysz, jak można to zrobić: http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason

Powiązane problemy