2016-07-23 8 views
2

Ich möchte auf den Ereignishandler eines LinkButtonCommand Ereignis zugreifen, aber im Snippet unter fieldInfo ist Null.Warum kann ich den Ereignishandler eines LinkButton-Ereignisses nicht mithilfe der Reflektion abrufen?

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 
     } 
    } 

-Code-Snippet wurde von this inspiriert.

Warum ist fieldInfo null?

Gibt es eine andere Möglichkeit, den Ereignishandler eines LinkButtonCommand Ereignisses zu erhalten?

Auch Hans Passant Lösung funktioniert nicht auf LinkButton mit Command als Feldname.

+0

Ich nehme an, das Ereignis hat explizite hinzufügen und entfernen Handler, und speichert seinen Delegaten nicht in einem dedizierten Feld. –

Antwort

3

Mit Blick auf die LinkCommand reference source:

public event CommandEventHandler Command ist "Magie".

LinkCommand verwendet die Basisklasse UI.Control und die Ereignisse werden in einer protected EventHandlerList Events gespeichert.

LinkCommand hat auch eine Privateigentum EventCommand genannt, die als Indexer für die Events Liste verwendet werden angezeigt.

Wenn ich die Quelle richtig bin lesen, müssen Sie Events[EventCommand] extrahieren und warf es zu CommandEventHandler wie LinkButton tut in OnCommand.

Dies scheint auch eine allgemeine Praxis für Klassen mit UI.Control als Basisklasse zu sein.

+0

Ich weiß nicht, warum ich 'EventCommand' nicht als Feldnamen versuchte. Massive Fehler. Wie auch immer, ich habe es gerade ausprobiert und es funktioniert. Genial! Auch sollte ich wahrscheinlich lernen, den Quellcode mehr zu verwenden (Yay OSS). – Chris

+1

@Chris Die Referenzquelle ist nicht Open Source. Du darfst es dir anschauen, aber denke zweimal darüber nach, bevor du irgendeinen Teil davon in deine eigene Software integrierst. Viel ist Open Source, https://github.com/dotnet/coreclr, https://github.com/dotnet/corefx, https://github.com/aspnet/, aber ich glaube nicht, dass WebForms hat. – hvd

+0

Genau aus diesem Grund habe ich einen explizit klaren Link gegeben, anstatt es zu zitieren, und erklärt, was zu tun ist, anstatt Code zu schreiben, der dem oben erwähnten Referenzcode ähnlich gewesen sein könnte. – Eris

Verwandte Themen