대리인을 사용할 때 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 이벤트에서 동일한 유형의 정보를 가져올 수있는 방법이 있습니까?
가입자 목록에 액세스하는 가장 일반적인 이유는 글로벌 수신 거부를 수행하는 것입니다. 이것은 특정 상황 (특히 외부 컨트롤러가 객체를 "은퇴"하지만 청취자가 여전히 가입되어 있기 때문에 불가능한 상황)에서 유용 할 수 있습니다. 이벤트에 대한 일관된'removeAll' 메커니즘이 유용 할 것입니다. – LBushkin
글쎄, 그냥 개체를 무효로 릴리스 할 수 있습니다 ... 이벤트는 구독자를 계속 살아 있습니다. 다른 곳에서 참조 정보가 없으면 구독자가 개체를 유지하지 않습니다. –
개체가 DataGridView의 이벤트에 가입했는지 확인하는 단위 테스트를 작성하려고합니다. 어쩌면 잘못된 방향에서 문제를보고 있을지도 모릅니다. 아니면이 테스트가 글쓰기에 가치있는 것이 아닙니다. –