C# nos permite to create custom event accessors.¿El campo de respaldo de un evento generado por compilador siempre garantiza usar el mismo nombre que el evento?
Action _custom;
public event Action Custom
{
add { _custom = (Action)Delegate.Combine(_custom, value); }
remove { _custom = (Action)Delegate.Remove(_custom, value); }
}
Si no se especifica ellos, the compiler creates them for you. C# spec idioma:
Al compilar un evento de campo como, el compilador crea automáticamente de almacenamiento para guardar el delegado, y crea descriptores de acceso para el caso de que añadir o eliminar controladores de eventos al campo delegado.
El código fuente descompilada usando dotPeek para un simple public event Action Public;
se ve de la siguiente manera:
private Action Public;
public event Action Public
{
add
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange<Action>(
ref this.Public, comparand + value, comparand);
}
while (action != comparand);
}
remove
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange<Action>(
ref this.Public, comparand - value, comparand);
}
while (action != comparand);
}
}
Es de destacar que el campo y el evento utilizan el mismo nombre. Esto ha llevado al some people a concluir que puede encontrar información sobre el campo de respaldo durante la reflexión buscando el campo en la clase con el mismo nombre que el evento. He implementado de la siguiente manera:
public static FieldInfo GetFieldInfo(this EventInfo eventInfo)
{
Contract.Requires(eventInfo != null);
return eventInfo.DeclaringType.GetField(
eventInfo.Name,
BindingFlags.DeclaredOnly | BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic);
}
Esto funciona, pero plantea la pregunta: ¿es el campo respaldo de un evento generado por el compilador siempre garantizado para utilizar el mismo nombre que el evento?
No es posible crear acceso a eventos personalizados que accedan a un delegado con el mismo nombre que utiliza Visual Studio. Esto da como resultado el mensaje: "El miembro con el mismo nombre ya está declarado". Me pregunto si podría concluir que cualquier evento para el que no esté disponible un delegado de respaldo con el mismo nombre sea un evento con acceso directo personalizado.
_ "¿Puedo preguntarte por qué quieres saber esto?" _ 1. ¡Porque es divertido e instructivo! :) 2. Estaba escribiendo un aspecto usando [PostSharp] (http://www.sharpcrafters.com/) que en cierto punto tenía que saber sobre el delegado del campo de respaldo. Pensé que podría ser un problema y pude utilizar otro enfoque. –
3. Como no he visto ningún problema con, por ejemplo, [esta respuesta] (http://stackoverflow.com/questions/3783267/how-to-get-a-delegate-object-from-an-eventinfo/3783491#3783491) Pensé que podría valer la pena preguntarlo específicamente. Estoy empezando a ver una correlación entre mis preguntas y el trío mágico que las responde. ¡Muchas gracias! :) También noto que realmente debería comenzar a leer esa especificación de C#. ¡Cosas interesantes! –
Y una divulgación 100% completa, estoy escribiendo un aspecto que elimina la necesidad de que escriba _ "delegar {}" _ al crear eventos, [de ahí mi pregunta anterior] (http://stackoverflow.com/q/9823457/590790). :) Me encantan este tipo de cosas. Incluso si pudiera ser excesivo, es una excelente forma de aprender. :) –