Отражение и приватный делегат полей событий в c # - PullRequest
1 голос
/ 01 сентября 2010

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

Я пытаюсь получить 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));возвращает:

  • Тест
  • Событие
  • RoutedEvent

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

  • Тест

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

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

  • _themeStyleCache
  • _styleCache
  • _templatedParent
  • _templateChild
  • _flags
  • _flags2
  • _parent
  • _inheritableProperties
  • MeasureRequest
  • ArrangeRequest
  • sizeChangedInfo
  • _parentIndex
  • _parent
  • _proxy
  • _contextStorage

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

Ответы [ 2 ]

2 голосов
/ 01 сентября 2010

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

public event RoutedEventHandler Loaded
{
    add
    {
        base.AddHandler(LoadedEvent, value, false);
    }
    remove
    {
        base.RemoveHandler(LoadedEvent, value);
    }
}
0 голосов
/ 01 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...