Я, вероятно, делаю что-то глупое, но здесь все идет.
Я пытаюсь получить 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)); возвращает:
Вызов PlotAllFields (typeof (Bar)); возвращает:
Я понимаю, что делегаты за событиями являются закрытыми полями поэтому я не могу получить к ним доступ в подклассе. Пока все хорошо.
Тогда я попробовал: PlotAllFields (typeof (FrameworkElement)); // из WPF
Ну ... Где 14 событий класса FrameworkElement ???
FrameworkElement не использует события, подобные полям, он вызывает AddHandler и RemoveHandler. В большинстве случаев к ним не подключены обработчики, поэтому WPF использует более компактную систему. Например, вот событие Loaded из Reflector:
public event RoutedEventHandler Loaded
{
add
{
base.AddHandler(LoadedEvent, value, false);
}
remove
{
base.RemoveHandler(LoadedEvent, value);
}
}
попробуйте эти флаги привязки
BindingFlags.Default |
BindingFlags.FlattenHierarchy |
BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.Public