EDIT: Có tùy chọn thứ tư, tức là để tránh tất cả những điều vô lý này và làm những gì Jon Skeet gợi ý trong câu trả lời của anh ấy.
Một cái gì đó như thế này?
public static EventHandler ToEventHandler(this ClickMenuItem clickMenuItem)
{
if (clickMenuItem == null)
return null;
return (sender, e) => clickMenuItem(sender, e);
}
và ngược lại:
public static ClickMenuItem ToClickMenuItem(this EventHandler eventHandler)
{
if (eventHandler == null)
return null;
return (sender, e) => eventHandler(sender, e);
}
Lưu ý rằng infers trình biên dịch mà đại biểu-loại để chuyển đổi lamda-biểu thức để.
EDIT: Nếu bạn thích, bạn cũng có thể sử dụng các đại biểu ẩn danh.
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
clickMenuItem(sender, e);
};
return eventHandler; // can be inlined, type-inference works fine
Thay thế thứ ba của khóa học, là tự viết một lớp đóng. Tôi sẽ không thực sự đề nghị điều này, nhưng nó cung cấp cho bạn một ý tưởng về những gì trình biên dịch làm với các phương thức nặc danh. Một cái gì đó như:
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);
}
}
}
bài viết liên quan: http://msdn.microsoft.com/en-us/library/dd233060.aspx – ja72