카테고리:

1 분 소요

문제 상황

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

태그: BindingFlags, Delegate, Event, EventArgs, EventHandler, MethodInfo, Reflection, 이벤트

업데이트: