동적으로 이벤트 핸들러 할당: 가능합니까?
소프트웨어 개발에서 이벤트 핸들러는 UI 요소 간의 이벤트 기반 상호 작용을 설정하는 데 매우 중요합니다. 그리고 기본 코드. 그러나 일반적인 질문이 생깁니다. 하나의 컨트롤에 할당된 이벤트 핸들러를 "훔쳐" 다른 컨트롤에 할당할 수 있습니까?
컴파일러 제한
할당할 때 = 연산자를 사용하는 이벤트 핸들러의 경우 컴파일러는 이미 할당된 이벤트 핸들러의 할당을 제한합니다. btn2에 대해 btn1에 할당된 이벤트 핸들러를 재사용하려고 하면 컴파일러 오류가 발생합니다.
반영: 솔루션 경로
컴파일러의 제한에도 불구하고 실제로 가능합니다. 리플렉션을 사용하여 런타임에 이벤트 핸들러를 전송합니다. 이 접근 방식을 사용하려면 컨트롤 클래스의 비공개 및 내부 멤버에 직접 액세스해야 합니다.
코드 샘플
다음 코드 조각을 고려하세요.
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"); } } }
이 코드에서는 비밀 내부 이벤트 키가 검색되어 btn1의 이벤트 핸들러 목록에 액세스하는 데 사용됩니다. 그런 다음 이벤트 핸들러가 btn1에서 제거되고 btn2에 추가됩니다.
복잡성과 제한
리플렉션이 이벤트 핸들러를 전송하는 방법을 제공하지만 다음 사항에 유의하는 것이 중요합니다. 이 접근 방식은 복잡하므로 주의해서 사용해야 합니다. 여기에는 프레임워크의 다양한 버전에 따라 변경될 수 있는 컨트롤 클래스의 내부 구현 세부 정보에 액세스하는 작업이 포함됩니다.
위 내용은 C#에서 이벤트 처리기를 동적으로 재할당할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!