2016-07-23 2 views
2

Я хочу получить доступ к обработчику события LinkButtonCommand, но в тексте ниже fieldInfo.Почему я не могу получить обработчик события события 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 Passant разрешение не работает на LinkButton с использованием Command в качестве названия поля.

+0

Я предполагаю, что событие имеет явное добавление и удаление обработчиков и не сохраняет его делегат в выделенном поле. –

ответ

3

Глядя на LinkCommand reference source:

public event CommandEventHandler Command это "волшебство".

LinkCommand использует базовый знак UI.Control, а события хранятся в protected EventHandlerList Events.

LinkCommand также имеет частную собственность под названием EventCommand, которая, как представляется, используется в качестве индексатора для списка Events.

Если я правильно читал исходники, вам нужно извлечь Events[EventCommand] и бросить CommandEventHandler как LinkButton делает в OnCommand.

Это также распространенная практика для классов с использованием 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

 Смежные вопросы

  • Нет связанных вопросов^_^