질문:
이벤트 핸들러를 "훔치는" 것이 가능합니까? 하나의 컨트롤과 연결되어 할당됩니다. 또?
답변:
예, 가능합니다. 주의사항은 반성이 필요합니다입니다. 많은 관련 멤버가 비공개 또는 내부로 숨겨져 있습니다.
구현:
새 Windows Forms 프로젝트를 만들고 해당 폼에 두 개의 버튼을 배치합니다. 그런 다음 다음 코드를 활용하세요.
using System; using System.ComponentModel; using System.Windows.Forms; using System.Reflection; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); button1.Click += new EventHandler(button1_Click); // Get secret click event key FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); object secret = eventClick.GetValue(null); // Retrieve the click event PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList events = (EventHandlerList)eventsProp.GetValue(button1, null); Delegate click = events[secret]; // Remove it from button1, add it to button2 events.RemoveHandler(secret, click); events = (EventHandlerList)eventsProp.GetValue(button2, null); events.AddHandler(secret, click); } void button1_Click(object sender, EventArgs e) { MessageBox.Show("Yada"); } } }
참고: 이는 Microsoft가 보안상의 이유로 중요한 메서드에 대한 액세스를 제한하는 방법을 보여줍니다.
위 내용은 리플렉션을 사용하여 컨트롤 간에 이벤트 처리기를 전송할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!