编辑:还有第四种选择,即避免所有这些废话,并按照 Jon Skeet 在他的回答中建议的去做。
这样的?
public static EventHandler ToEventHandler(this ClickMenuItem clickMenuItem)
{
if (clickMenuItem == null)
return null;
return (sender, e) => clickMenuItem(sender, e);
}
反之:
public static ClickMenuItem ToClickMenuItem(this EventHandler eventHandler)
{
if (eventHandler == null)
return null;
return (sender, e) => eventHandler(sender, e);
}
请注意,编译器会推断出要将 lamda 表达式转换为哪些委托类型。
编辑:如果您愿意,也可以使用匿名委托。
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
clickMenuItem(sender, e);
};
return eventHandler; // can be inlined, type-inference works fine
当然,第三种选择是自己编写一个闭包类。我不会真的推荐这个,但它让您了解编译器对匿名方法的作用。比如:
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);
}
}
}