Delegate
내부적 으로 처리해야하는 상황에 직면했지만 일반적인 제약이 필요했습니다. 특히 리플렉션을 사용하여 이벤트 처리기를 추가하고 싶었지만 대리자에 대한 일반 인수를 사용하고 싶었습니다. "처리기"형태 변수이며, 이후 아래의 코드는 작업, 컴파일러는 캐스팅하지 않습니다하지 않습니다 Handler
합니다 Delegate
:
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, (Delegate) d);
}
그러나 변환을 수행하는 함수를 전달할 수 있습니다. 인수를 convert
취하고 다음 Handler
을 반환합니다 Delegate
.
public void AddHandler<Handler>(Control c, string eventName,
Func<Delegate, Handler> convert, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, convert(d));
}
이제 컴파일러는 행복합니다. 메서드를 호출하는 것은 쉽습니다. 예를 들어 KeyPress
Windows Forms 컨트롤 의 이벤트에 연결 :
AddHandler<KeyEventHandler>(someControl,
"KeyPress",
(h) => (KeyEventHandler) h,
SomeControl_KeyPress);
SomeControl_KeyPress
이벤트 대상은 어디에 있습니까 ? 핵심은 변환기 람다입니다. 작동하지 않지만 컴파일러에게 유효한 대리자를 제공했는지 확인합니다.
(280Z28 시작) @Justin : 왜 이것을 사용하지 않습니까?
public void AddHandler<Handler>(Control c, string eventName, Handler d) {
c.GetType().GetEvent(eventName).AddEventHandler(c, d as Delegate);
}
(말단 280Z28)