EDITAR: Hay una cuarta opción, es decir, evitar todas estas tonterías y hacer lo que Jon Skeet sugiere en su respuesta.
¿Algo como esto?
public static EventHandler ToEventHandler(this ClickMenuItem clickMenuItem)
{
if (clickMenuItem == null)
return null;
return (sender, e) => clickMenuItem(sender, e);
}
y lo contrario:
public static ClickMenuItem ToClickMenuItem(this EventHandler eventHandler)
{
if (eventHandler == null)
return null;
return (sender, e) => eventHandler(sender, e);
}
Tenga en cuenta que los compiladores infiere que delegan tipos para convertir las expresiones Lamda-a.
EDITAR: Si lo prefiere, también puede usar delegados anónimos.
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
clickMenuItem(sender, e);
};
return eventHandler; // can be inlined, type-inference works fine
La tercera alternativa, por supuesto, es escribir una clase de cierre usted mismo. Realmente no recomendaría esto, pero te da una idea de lo que hace el compilador con los métodos anónimos. Algo como:
public static class ClickMenuItemExtensions
{
public static EventHandler ToEventHandler(this ClickMenuItem clickMenuItem)
{
if (clickMenuItem == null)
return null;
// new EventHandler not required, included only for clarity
return new EventHandler(new Closure(clickMenuItem).Invoke);
}
private sealed class Closure
{
private readonly ClickMenuItem _clickMenuItem;
public Closure(ClickMenuItem clickMenuItem)
{
_clickMenuItem = clickMenuItem;
}
public void Invoke(object sender, EventArgs e)
{
_clickMenuItem(sender, e);
}
}
}
artículo relacionado: http://msdn.microsoft.com/en-us/library/dd233060.aspx – ja72