2012-03-05 35 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