2016-07-23 2 views
2

LinkButton 이벤트의 Command 이벤트 핸들러에 액세스하려고하지만 fieldInfo의 스 니펫은 null입니다.리플렉션을 사용하여 LinkButton 이벤트의 이벤트 핸들러를 가져올 수없는 이유는 무엇입니까?

LinkButton button = new LinkButton(); 
button.Command += (s, e) => { }; 
Type type = button.GetType(); 
EventInfo[] eventInfos = type.GetEvents(BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 
foreach (EventInfo eventInfo in eventInfos) 
    if (eventInfo.Name == "Command") 
    { 
     // fieldInfo is null 
     FieldInfo fieldInfo = eventInfo.DeclaringType.GetField(eventInfo.Name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 
     Delegate delegates = (Delegate)fieldInfo.GetValue(button); 
     foreach (Delegate handler in delegates.GetInvocationList()) 
     { 
      eventInfo.RemoveEventHandler(button, handler); 
      // or 
      eventInfo.AddEventHandler(button, handler); 
      // or do whatever with handler 
     } 
    } 

코드 스 니펫은 this에서 영감을 받았습니다.

fieldInfo이 (가) null입니까?

LinkButtonCommand 이벤트의 이벤트 처리기를 가져 오는 다른 방법이 있습니까?

Hans PassantLinkButton의 경우 필드 이름에을 사용하면 해결되지 않습니다.

+0

이벤트에 명시 적으로 추가 및 제거 핸들러가 있고 전용 필드에 대리자를 저장하지 않는다고 가정합니다. –

답변

3

LinkCommand reference source에서 상대 :

public event CommandEventHandler Command는 "매직"입니다.

LinkCommand은 기본 클래스 UI.Control을 사용하며 이벤트는 protected EventHandlerList Events에 저장됩니다.

LinkCommand에는 EventCommand이라는 개인 속성이 있으며 Events 목록의 인덱서로 사용됩니다.

소스를 올바르게 읽는 경우 을 추출하여 LinkButton과 같이 과 같이 CommandEventHandler으로 변환해야합니다.

이 또한 UI.Control을 기본 클래스로 사용하는 클래스에 대한 일반적인 사례 인 것으로 보입니다.

+0

필드 이름으로'EventCommand'를 시도하지 않은 이유를 모르겠습니다. 방대한 실패. 어쨌든, 나는 그것을 시도하고 그것은 작동합니다. 굉장해! 또한 나는 아마 소스 코드를 더 많이 사용하는 법을 배워야한다. (Yay OSS). – Chris

+1

@Chris 참고 소스는 오픈 소스가 아닙니다. 당신은 그것을 볼 수 있지만 자신의 소프트웨어에 그것을 통합하기 전에 두 번 생각하십시오. https://github.com/dotnet/coreclr, https://github.com/dotnet/corefx, https://github.com/aspnet/, 오픈 소스가 많았지 만 WebForms는 가지고 있다고 생각하지 않습니다. – hvd

+0

정확하게 인용 부호 대신 명시 적으로 명확한 링크를 제공 한 이유와 앞서 언급 한 참조 코드와 유사한 코드를 작성하는 대신 수행 할 작업을 설명했습니다. – Eris