[C#] Reflection으로 등록된 이벤트 초기화하기
카테고리: C# + Unity
문제 상황
Visual Studio IDE를 사용하면 Winform 환경에서 이벤트를 손 쉽게 추가하거나 제거할 수 있다. 예를 들어 Load 이벤트를 추가한다고 가정하면 자동으로 아래와 같이 작성된다.
- Form1.cs
private void Form1_Load(object sender, System.EventArgs e) {
// Add your form load event handling code here.
}
- Form1.Designer.cs
this.Load += new System.EventHandler(this.Form1_Load);
문제는 런타임 도중에 해당 이벤트를 해제해야할 필요가 있을 경우에 발생한다. 자세히 설명하면 이벤트를 해제하기 위해서는 간단히 빼기 대입 연산자(-=
)를 사용하여 다음같이 -= new System.EventHandler(this.Form1_Load)
이벤트 구독을 취소하지만, 접근 제한자 등의 조치로 인해 this.Form1_Load
에 접근하지 못하므로써 이벤트를 해제하지 못하는 상황이 생긴다.
문제 해결
해결하는 방법은 의외로 간단하다. 아래와 예제와 같이 System.Reflection.MethodInfo
를 사용하면 된다.
private void button1_Click(object sender, EventArgs e) {
MessageBox.Show("button1");
}
private void button2_Click(object sender, EventArgs e) {
MethodInfo handler = typeof(Form1).GetMethod("button1_Click", BindingFlags.NonPublic | BindingFlags.Instance);
if (handler != null) {
Delegate delegateInstance = Delegate.CreateDelegate(typeof(EventHandler), this, handler);
this.button1.Click -= (EventHandler)delegateInstance;
}
}
참고
https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events
https://learn.microsoft.com/ko-kr/dotnet/api/system.reflection.methodinfo?view=net-9.0