> 백엔드 개발 > C++ > C#에서 런타임 시 이벤트 처리기를 훔쳐서 다시 할당할 수 있나요?

C#에서 런타임 시 이벤트 처리기를 훔쳐서 다시 할당할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-30 21:06:09
원래의
324명이 탐색했습니다.

Can Event Handlers Be Stolen and Reassigned at Runtime in C#?

이벤트 핸들러 훔치기: 런타임 오디세이

소개:

소프트웨어 개발에서는 때로는 하나의 컨트롤에서 이벤트 핸들러를 할당해야 할 수도 있습니다. 런타임에 다른 사람에게. 이 문서에서는 잠재적인 주의 사항과 사용 가능한 해결 방법을 탐색하면서 이러한 작업의 타당성을 자세히 살펴봅니다.

원래 질문:

원래 질문은 할당된 이벤트 핸들러를 전송하는 방법을 찾는 것이었습니다. 런타임 시 버튼(btn1)에서 다른 버튼(btn2)으로. 그러나 컴파일러는 이 할당이 유효하지 않은 것으로 간주하여 이벤트 핸들러는 할당의 왼쪽에만 할당할 수 있다고 명시했습니다.

해결책:

간단한 접근 방식에 컴파일러 오류가 발생했습니다. , 리플렉션이 필요하다는 주의 사항이 있지만 런타임 시 이벤트 핸들러를 훔치는 것이 실제로 가능하다는 것이 밝혀졌습니다. 리플렉션은 일반적으로 액세스할 수 없는 객체의 비공개 및 내부 멤버에 대한 액세스 권한을 부여합니다.

구현 세부 정보:

이 솔루션에는 여러 단계가 포함됩니다.

  1. 검색 비밀 이벤트 키: 이벤트 핸들러는 "EventClick"이라는 비공개 필드를 사용하여 내부적으로 저장됩니다. 리플렉션은 이 필드에 정적으로 액세스하는 데 사용됩니다.
  2. EventHandlerList 가져오기: Component 클래스의 "Events" 속성은 등록된 모든 이벤트 핸들러를 포함하는 EventHandlerList를 저장합니다. 이 속성은 리플렉션을 통해 액세스됩니다.
  3. 소스에서 핸들러 제거: EventHandlerList를 사용하면 소스 제어(btn1)에서 이벤트 핸들러를 제거할 수 있습니다.
  4. 대상에 핸들러 추가: 그런 다음 동일한 EventHandlerList를 사용하여 대상 컨트롤에 이벤트 핸들러를 추가합니다. (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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿