2012-01-30 13 views
5

Data la definizione seguente classeIspezione gli attributi sul campo generato dietro un evento di campo simile

public class MyClass 
{ 
    [System.ComponentModel.Browsable(true)] 
    [field:NonSerialized] 
    public event EventHandler MyEvent; 
} 

qualche altra parte nel mio codice, vorrei vedere gli attributi dell'evento.

var attributes = typeof(MyClass) 
        .GetEvents() 
        .SelectMany(n => n.GetCustomAttributes(true)); 

Ma io sto vedendo solo BrowsableAttribute in quel attributi collezione.

Come posso ottenere le informazioni sull'attributo field:NonSerialized?

+1

'GetFields' con appropriati' BindingFlags' vi farà ottenere tutti i campi, ma per andare oltre dobbiamo sapere quali informazioni * iniziano * con, e quali informazioni state provando a * ottenere *. Vuoi essere in grado di dire: "per ogni evento tipo campo, dimmi gli attributi sul campo dietro * quell'evento *"? Oppure la risposta a "ci sono dei campi' NonSerializzati', inclusi quelli generati? " essere abbastanza? O...? – AakashM

risposta

2

La sintassi field: indica che l'attributo è collegato al campo generato dal compilatore (per supportare questo campo). Non si conosce mai il nome di questo campo, poiché si tratta di un dettaglio di implementazione e non fa parte dello EventInfo (poiché gli eventi non devono essere necessariamente supportati da un campo specifico - potrebbe essere utilizzato come proxy o uno EventHandlerList ecc.) .

Se è necessario tale livello di informazioni, è possibile implementare manualmente l'evento (anziché un "evento di tipo campo", come illustrato), ma; in realtà è raro che tu debba saperlo. Questa informazione è veramente necessaria solo da BinaryFormatter e al, per dire "mani fuori".

Un altro approccio sarebbe quello di utilizzare GetFields(), ma ancora; non esiste un modo efficace per mappare i campi agli eventi.

Problemi correlati