Tôi đã gặp một tình huống mà tôi cần phải giải quyết Delegatenội bộ nhưng tôi muốn có một hạn chế chung. Cụ thể, tôi muốn thêm một trình xử lý sự kiện bằng cách sử dụng phản chiếu, nhưng tôi muốn sử dụng một đối số chung cho đại biểu. Đoạn mã dưới đây KHÔNG hoạt động, vì "Trình xử lý" là một biến kiểu và trình biên dịch sẽ không truyền Handlertới Delegate:
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
Tuy nhiên, bạn có thể chuyển một hàm thực hiện chuyển đổi cho bạn. convertnhận Handlerđối số và trả về Delegate:
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
Bây giờ trình biên dịch là hạnh phúc. Gọi phương thức là dễ dàng. Ví dụ: đính kèm vào KeyPresssự kiện trên điều khiển Windows Forms:
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
nơi SomeControl_KeyPresslà mục tiêu của sự kiện. Chìa khóa là lambda bộ chuyển đổi - nó không hoạt động, nhưng nó thuyết phục trình biên dịch mà bạn đã cấp cho nó một đại biểu hợp lệ.
(Bắt đầu 280Z28) @Justin: Tại sao không sử dụng cái này?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(Cuối 280Z28)