이벤트 핸들러를 교활하게 "훔칠" 수 있습니까?
코딩 문제에서 한 컨트롤에서 다른 컨트롤로 이벤트 핸들러를 전송하려고 합니다. . 그러나 컴파일러는 굴하지 않는 장벽입니다.
코드 수수께끼:
Button btn1 = new Button(); btn1.Click += new EventHandler(btn1_Click); Button btn2 = new Button(); // Assign btn1's event to btn2 (but met with rejection from compiler) btn2.Click += btn1.Click; // Compiler denies
가능한 도난 기법:
반사 기반 트릭:
무차별 대입이 귀하의 스타일이 아니라면, 반성의 망토를 걸치면 은밀한 길이 드러날 수도 있습니다.
using System.Reflection; // Declare event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); // Retrieve click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events1 = (EventHandlerList)eventsProp.GetValue(btn1, null); Delegate click = events1[eventClick.GetValue(null)]; // Remove from btn1, assign to btn2 events1.RemoveHandler(eventClick.GetValue(null), click); EventHandlerList events2 = (EventHandlerList)eventsProp.GetValue(btn2, null); events2.AddHandler(eventClick.GetValue(null), click);
조심하십시오. Microsoft는 그러한 기동을 막기 위해 강력한 장벽을 세웠습니다. 하지만 용기 있는 사람들에게는 이 반성을 휘두르는 기술을 통해 이벤트 처리의 숨겨진 영역에 접근할 수 있습니다!
위 내용은 C#의 컨트롤 간에 이벤트 처리기를 어떻게 전송할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!