【问题标题】:FieldInfo returning null on Component [duplicate]FieldInfo 在组件上返回 null [重复]
【发布时间】:2014-12-02 04:25:00
【问题描述】:

我正在尝试获取 BindingSource 的事件列表并返回 null 作为我的代码:

// bs is my BindingSource
PropertyInfo propertyInfo = bs.GetType()
    .GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | 
        BindingFlags.Instance | BindingFlags.FlattenHierarchy);

EventHandlerList eventHandlerList = propertyInfo
    .GetValue(bs, new object[] { }) as EventHandlerList;

// The following line returns null
FieldInfo fieldInfo = typeof(BindingSource)
    .GetField("AddingNew", BindingFlags.Instance | BindingFlags.FlattenHierarchy | 
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 

我放置了所有可能的 BindingFlags,但错误仍然存​​在。 我做错了什么?

【问题讨论】:

  • 你写了两次你得到一个错误,一次返回null。它是哪一个?如果是错误,错误信息是什么? BindingSource 类型中 AddingNew 字段的确切声明是什么?你为什么使用typeof(BindingSource) 而不是bs.GetType()?请参阅stackoverflow.com/help/mcvestackoverflow.com/help/how-to-ask

标签: c# winforms


【解决方案1】:

找到更好的答案作为重复的AddEventHandler using reflection - 使用Type.GetEvent


AddingNew 是事件,因此要操作它,您需要获取相应的自动生成方法 - “remove_{EventName}”和“add_{EventName}”:

var add = typeof(System.Windows.Forms.BindingSource).GetMethod("add_AddingNew");

正确使用GetEvent:

var adding = typeof(System.Windows.Forms.BindingSource).GetEvent("AddingNew");

有关如何实现事件的详细信息,请参阅How are events implemented

【讨论】:

  • 我这样修改了我的代码: var added = bs.GetType().GetEvent(myEventName); // myEventName 是 "AddingNew" 对象 eventkey = added; var eventHandler = eventHandlerList[eventkey] 作为代表;我的变量 eventHandler 正在返回 null。
  • @Luana 我不知道你对用一些对象索引一些随机集合有什么期望......请调试你的代码,看看你的集合中实际存在什么。还要确保阅读链接文章 - 事件是奇怪的实体,通过反射查看时与常规字段不匹配。
猜你喜欢
  • 2019-10-04
  • 2011-11-01
  • 2017-05-09
  • 2012-02-01
  • 2015-09-11
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多