2014-12-02 49 views
0

我试图得到的BindingSource的事件列表返回null,并返回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但错误依然存在。 我在做什么错?

+1

你写了两次,你得到一个错误,一旦返回'null'。这是什么?如果这是一个错误,那么错误信息是什么? 'BindingSource'类型中'AddingNew'字段的确切声明是什么?你为什么使用'typeof(BindingSource)'而不是'bs.GetType()'?请参阅http://stackoverflow.com/help/mcve和http://stackoverflow.com/help/how-to-ask – 2014-12-02 04:29:16

回答

0

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


AddingNew是大事,所以要操纵它,你需要得到相应的自动生成的方法 - “remove_ {事件名称}” 和 “add_ {事件名称}”:

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

正确的方式使用GetEvent

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

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

+0

我修改了我的代码,如下所示: var adding = bs.GetType()。GetEvent( myEventName); // myEventName是“AddingNew” object eventkey = adding; var eventHandler = eventHandlerList [eventkey] as Delegate; 我的变量_eventHandler_返回null。 – Luana 2014-12-02 13:22:08

+0

@Luana我不知道你从一些对象索引一些随机集合期望什么......请调试你的代码,看看你的集合中实际存在什么。另外请确保阅读链接的文章 - 事件是奇怪的实体,并且通过反射查看时不匹配常规字段。 – 2014-12-02 19:25:55