2012-03-05 126 views
0

我在堆栈溢出中发现了一个方法,它从给定事件中剥离所有事件处理程序。但是,当我将代码复制到我的程序中时,它给了我一个“未设置为实例的引用”错误。我的事件处理程序剥离程序代码不起作用

这里是有问题的代码:

 FieldInfo f1 = typeof(Control).GetField("DocumentCompleted", 
     BindingFlags.Static | BindingFlags.NonPublic); 
     object obj = f1.GetValue(browser); 
     PropertyInfo pi = browser.GetType().GetProperty("Events", 
     BindingFlags.NonPublic | BindingFlags.Instance); 
     EventHandlerList list = (EventHandlerList)pi.GetValue(browser, null); 
     list.RemoveHandler(obj, list[obj]); 

在此行发生错误:

object obj = f1.GetValue(browser); 

的浏览器对象是web浏览器的一个实例,它已在这一点上已经速溶。


编辑:想出了一种不同的方式来删除处理程序。

+0

该错误会表明它是'f1'这不是设置。 – ChrisF 2012-03-05 10:31:04

+0

试试这个'FieldInfo f1 = typeof(Control).GetField(“DocumentCompleted”)'。删除BindingFlags – ebattulga 2012-03-05 10:44:36

+0

仍为空,它没有为我工作。 – TheGateKeeper 2012-03-05 10:47:57

回答

2

DocumentCompleted是一个公共事件,而不是一个私有静态字段,所以F1为空,并且会导致错误

+0

我试过“FieldInfo f1 = typeof(Control).GetField(”DocumentCompleted“,BindingFlags.Public);” 但f1仍为空。 – TheGateKeeper 2012-03-05 10:40:19

+0

使用GetEvent(“DocumentCompleted”,BindingFlags.Public) – linquize 2012-03-06 01:22:50