.NET/C\#반사 등록 이벤트 사용 방법 설명
방사선 을 통 해 운영 할 때.NET 의 모든 유형(클래스,구조,의뢰,인터페이스 와 매 거 진 등 포함)의 구성원 을 얻 을 수 있 으 며 방법,속성,사건,구조 함수 등 을 포함한다.각 멤버 의 이름,한정 문자,파라미터 등 도 얻 을 수 있다.반사 가 있 으 면 모든 유형 을 손금 보 듯 잘 알 수 있다.구조 함수 의 정 보 를 얻 으 면 대상 을 직접 만 들 수 있 습 니 다.이 대상 의 유형 이 컴 파일 할 때 모 르 더 라 도.그러면 사건 을 어떻게 등록 합 니까?
본 고 는 반사 등록 사건 을 어떻게 사용 하 는 지 소개 할 것 이다.다음은 더 이상 할 말 이 없 으 니 상세 한 소 개 를 살 펴 봅 시다.
반사 사용 안 함
예 를 들 어 우리 가 반사 하고 싶 은 유형 은 다음 과 같다.
public class Walterlv
{
public event EventHandler BlogPublished;
}
그러면 다음 코드 만 사용 하면 이벤트 등록 을 완성 할 수 있 습 니 다.
var walterlv = new Walterlv();
walterlv += Walterlv_BlogPublished;
public void Walterlv_BlogPublished(object sender, EventHandler handler)
{
}
사용 반사반 사 를 사용 하면:
var walterlv = new Walterlv();
var eventInfo = typeof(Walterlv).GetEvent(nameof(BlogPublished));
var handler = new EventHandler(Walterlv_BlogPublished);
eventInfo.AddEventHandler(walterlv, handler);
물론 실제 사용 할 때 Walterlv 유형 을 방문 할 수 있다 면 반사 도 사용 하지 않 기 때문에 보통 상황 은 다음 과 같다.
public void AddHandler<T>(T instance, string eventName, EventHandler handler)
{
var eventInfo = instance.GetType().GetEvent(eventName);
eventInfo.AddEventHandler(instance, handler);
}
안전하게 반사 사용상기 방식 은 반사 로 사건 을 성공 적 으로 등 록 했 지만 실제 우리 의 매개 변수 에는 특정한 유형의 의뢰 EventHandler 가 들 어 왔 습 니 다.실제로 사건 의 의뢰 종 류 는 매우 많다.
의뢰 에 서 는 서명 이 똑 같 더 라 도 같은 의뢰 유형 이 아 닙 니 다.들 어 오 는 매개 변수 유형 이
EventHandler<EventArgs>
로 바 뀌 거나 BlogPublished 이벤트 의 유형 이 EventHandler▲의뢰 전환 불가
그래서 우 리 는 사건 을 등록 하 는 더 안전 한 방법 이 있어 야 한다.
정상 적 인 상황 에서 우리 가 서명 호 환 을 바 꾸 는 의뢰 는 구조 함 수 를 사용 하 는 것 입 니 다.
public EventHandler ConvertDelegate(EventHandler<EventArgs> handler)
{
return new EventHandler(handler);
}
그러면 반사 에서 Delegate.Create Delegate 를 사용 하여 지정 한 형식의 의뢰 를 만들어 야 합 니 다.
public void AddHandler<T>(T instance, string eventName)
{
var eventInfo = instance.GetType().GetEvent(eventName);
var methodInfo = GetType().GetMethod(nameof(Walterlv_BlogPublished));
var @delegate = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, methodInfo);
eventInfo.AddEventHandler(instance, @delegate);
}
public void Walterlv_BlogPublished(object sender, EventHandler handler)
{
}
여기 서Delegate.CreateDelegate
의 역할 은 의뢰 유형의 전환 을 집행 하 는 것 이다.나 는.NET Core/Framework 생 성 의뢰 는 반사 호출 성능 을 대폭 향상 시 킵 니 다.에서 도 이 방법 을 언급 한 적 이 있다.참고 자료
c# - AddEventHandler using reflection - Stack Overflow
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.