c#中事件的反射和私有委托字段

时间:2010-09-01 12:45:55

标签: c# wpf events reflection delegates

我可能正在做一些愚蠢的事情,但就在这里。

我正试图通过反射从公共事件中获取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

那么...... FrameworkElement类的14个事件在哪里???

2 个答案:

答案 0 :(得分:2)

FrameworkElement不使用类似字段的事件,它会调用AddHandlerRemoveHandler。大多数情况下,他们没有附加处理程序,因此WPF使用更节省空间的系统。例如,这是来自Reflector:

的Loaded事件
public event RoutedEventHandler Loaded
{
    add
    {
        base.AddHandler(LoadedEvent, value, false);
    }
    remove
    {
        base.RemoveHandler(LoadedEvent, value);
    }
}

答案 1 :(得分:0)

尝试这些绑定标志

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