2009-12-18 3 views
3

대리인을 사용할 때 Delegate.GetInvocationList() 메서드를 사용하여 런타임에 대리인의 호출 목록을 검색 할 수 있습니다.런타임에 이벤트에 대한 구독자 목록을 검색하려면 어떻게합니까?

이벤트와 관련된 구독자 목록에 액세스하는 방법이 있습니까? 이 example (SO#1237001)의 코드를 실행하고 즉시 창에서 SecondChange 이벤트를 System.MultiCastDelegate로 캐스팅 한 다음 GetInvocationList 메서드를 호출 할 수있었습니다.

그러나 시나리오에서는 System.Windows.Forms.DataGridView를 사용하고 있으며 런타임에 CellClick 이벤트의 호출 목록을 검사하고 싶습니다. 나는이 사건의 선언의 차이는 분명히있다 볼 수 있습니다

The event 'System.Windows.Forms.DataGridView.CellClick' can only appear on the left hand side of += or -=

: 나는 CellClick에 주조의 종류를 시도 할 때, 나는 다음과 같은 오류를받을. 시계의 예에서 이벤트는 다음과 같이 선언한다 :

[SRDescription("DataGridView_CellClickDescr"), SRCategory("CatMouse")] 
public event DataGridViewCellEventHandler CellClick 
{ 
    add 
    { 
     base.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCLICK, value); 
    } 
    remove 
    { 
     base.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCLICK, value); 
    } 
} 

이유는 하나가 아니라에, 시계의 예에 GetInvocationList를 호출 할 수

public event Func<DateTime, bool> SecondChange; 

그리고 DataGridView에있는

이벤트는 다음과 같이 선언 DataGridView 이벤트? GetInvocationList가 반환하는 DataGridView 이벤트에서 동일한 유형의 정보를 가져올 수있는 방법이 있습니까?

답변

3

은 (속성이 get/set를 정의하는 방법 등) (만 해당) add/remove API를 정의하는 event의 요점.

이벤트의 전체 포인트는 (가입자 액세스) 외부 을 할 수 있다는 것입니다. "시계"예제에서 목록에 액세스하는 코드는 입니다.event을 선언하는 유형입니다. 괜찮습니다. 유형 내에서 배킹 구현 (대개 대리자 필드)에 액세스 할 수 있습니다.

외부 적으로는을 에 가입 했으므로 이미 알고있는 자신의 처리기 만 신경 써야합니다. 후원자를 가져 오기위한 시도가 존재하지만 취성이고 권장되지 않습니다. 이 경우 예를 들어 EventHandlerList을 사용합니다.

왜 필요한가요? 그것은 보통 당신이 뭔가 잘못하고 있음을 의미합니다 (미안하지만 그렇지 않습니다).

+0

가입자 목록에 액세스하는 가장 일반적인 이유는 글로벌 수신 거부를 수행하는 것입니다. 이것은 특정 상황 (특히 외부 컨트롤러가 객체를 "은퇴"하지만 청취자가 여전히 가입되어 있기 때문에 불가능한 상황)에서 유용 할 수 있습니다. 이벤트에 대한 일관된'removeAll' 메커니즘이 유용 할 것입니다. – LBushkin

+0

글쎄, 그냥 개체를 무효로 릴리스 할 수 있습니다 ... 이벤트는 구독자를 계속 살아 있습니다. 다른 곳에서 참조 정보가 없으면 구독자가 개체를 유지하지 않습니다. –

+0

개체가 DataGridView의 이벤트에 가입했는지 확인하는 단위 테스트를 작성하려고합니다. 어쩌면 잘못된 방향에서 문제를보고 있을지도 모릅니다. 아니면이 테스트가 글쓰기에 가치있는 것이 아닙니다. –

관련 문제