Tôi đã gặp một tình huống mà tôi cần phải giải quyết Delegate
nộ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 Handler
tớ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. convert
nhậ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 KeyPress
sự kiện trên điều khiển Windows Forms:
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
nơi SomeControl_KeyPress
là 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)