2012-01-30 9 views
5

Dada la siguiente definición de claseInspección de los atributos en el campo generado detrás de un evento de campo como

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

En algún otro lugar en mi código, me gustaría ver los atributos en el evento.

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

Pero estoy viendo solamente BrowsableAttribute en que los atributos de la colección.

¿Cómo puedo obtener la información de atributo field:NonSerialized?

+1

'GetFields' con' BindingFlags' apropiados le proporcionará todos los campos, pero para ir más allá necesitamos saber con qué información * comienza * y qué información está tratando de * llegar *. ¿Desea poder decir: "para cada evento parecido a un campo, dígame los atributos en el campo detrás de * ese evento *"? ¿O respondería a "hay algún campo 'No Serializado', incluidos los generados?" ¿bastar? O...? – AakashM

Respuesta

2

La sintaxis field: significa que el atributo se adjunta al campo generado por el compilador (para admitir este campo). Nunca se llega a conocer el nombre de este campo, ya que es un detalle de implementación, y no es parte del EventInfo (ya que los eventos no necesitan ser respaldados por un campo específicamente - podría ser proxy, o un EventHandlerList, etc.) .

Si necesita ese nivel de información, puede implementar el evento manualmente (en lugar de un "evento de tipo campo", como se muestra), pero; en realidad es raro que necesites saber esto. Esta información es realmente solo es necesaria por BinaryFormatter y otros, para decir "manos libres".

Otro enfoque sería usar GetFields(), pero de nuevo; no existe una forma robusta de asignar campos a los eventos.

Cuestiones relacionadas