소프트웨어 개발에서는 때로는 하나의 컨트롤에서 이벤트 핸들러를 할당해야 할 수도 있습니다. 런타임에 다른 사람에게. 이 문서에서는 잠재적인 주의 사항과 사용 가능한 해결 방법을 탐색하면서 이러한 작업의 타당성을 자세히 살펴봅니다.
원래 질문은 할당된 이벤트 핸들러를 전송하는 방법을 찾는 것이었습니다. 런타임 시 버튼(btn1)에서 다른 버튼(btn2)으로. 그러나 컴파일러는 이 할당이 유효하지 않은 것으로 간주하여 이벤트 핸들러는 할당의 왼쪽에만 할당할 수 있다고 명시했습니다.
간단한 접근 방식에 컴파일러 오류가 발생했습니다. , 리플렉션이 필요하다는 주의 사항이 있지만 런타임 시 이벤트 핸들러를 훔치는 것이 실제로 가능하다는 것이 밝혀졌습니다. 리플렉션은 일반적으로 액세스할 수 없는 객체의 비공개 및 내부 멤버에 대한 액세스 권한을 부여합니다.
이 솔루션에는 여러 단계가 포함됩니다.
다음 코드는 이벤트 스틸 기술을 보여줍니다.
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"); } } }
As 코드에서 알 수 있듯이 이벤트 핸들러를 훔치는 프로세스는 다소 복잡하며 내부 개체 구조에 대한 복잡한 지식이 필요합니다. Microsoft가 이러한 구조에 대한 직접적인 액세스를 방지하기 위해 상당한 노력을 기울인 것은 분명하므로 이 기술을 신중하게 사용해야 함을 시사합니다.
위 내용은 C#에서 런타임 시 이벤트 처리기를 훔쳐서 다시 할당할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!