Поля событий и отражений для закрытого делегата событий в c #

Я, вероятно, делаю что-то глупое, но здесь все идет.

Я пытаюсь получить FieldInfo из публичного события с помощью отражения.

Проверьте эту функцию:

  public void PlotAllFields(Type type) {
      BindingFlags all = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
      FieldInfo[] fields = type.GetFields(all);
      Console.WriteLine(type + "-------------------------");
      foreach (var fieldInfo in fields) {
          Console.WriteLine(fieldInfo.Name);
      }
  }

  public class Bar : Foo {}

  public class Foo {
      public string Test;
      public event EventHandler Event;
      public event RoutedEventHandler RoutedEvent;
  }

Вызов PlotAllFields (typeof (Foo)); возвращает:

  • Test
  • Event
  • RoutedEvent

Вызов PlotAllFields (typeof (Bar)); возвращает:

  • Тест

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

Тогда я попробовал: PlotAllFields (typeof (FrameworkElement)); // из WPF

  • _themeStyleCache
  • _styleCache
  • _templatedParent
  • _templateChild
  • _flags
  • _flags2
  • _parent
  • _inheritableProperties
  • 12256252_Rain_Regest 125 ] _parentIndex
  • _parent
  • _proxy
  • _contextStorage

Ну ... Где 14 событий класса FrameworkElement ???

1
задан andrecarlucci 1 September 2010 в 12:45
поделиться

2 ответа

FrameworkElement не использует события, подобные полям, он вызывает AddHandler и RemoveHandler. В большинстве случаев к ним не подключены обработчики, поэтому WPF использует более компактную систему. Например, вот событие Loaded из Reflector:

public event RoutedEventHandler Loaded
{
    add
    {
        base.AddHandler(LoadedEvent, value, false);
    }
    remove
    {
        base.RemoveHandler(LoadedEvent, value);
    }
}
2
ответ дан 2 September 2019 в 21:39
поделиться

попробуйте эти флаги привязки

BindingFlags.Default |
BindingFlags.FlattenHierarchy |
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public

http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.REFLECTION.BINDINGFLAGS);k(TargetFrameworkMoniker-%22. NETFRAMEWORK,VERSION%3dV3.5%22);k(DevLang-CSHARP)&rd=true

0
ответ дан 2 September 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: