2012-03-05 5 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); 

Объекта браузера является экземпляром WebBrowser, и это было instantized в этой точке.


Редактировать: Пришел другой способ удаления обработчиков.

+0

ошибка будет означать, что это 'f1', который не был установлен. – ChrisF

+0

попробуйте это 'FieldInfo f1 = typeof (Control) .GetField (" DocumentCompleted ")'. remove BindingFlags – ebattulga

+0

Все еще null, он не работал для меня. – TheGateKeeper

ответ

2

DocumentCompleted является публичным мероприятием, а не частное статическое поле, так f1 равно нулю и привести к вашей ошибке

+0

Я попробовал «FieldInfo f1 = typeof (Control) .GetField (« DocumentCompleted », BindingFlags.Public); Но f1 все еще был нулевым. – TheGateKeeper

+0

использовать GetEvent ("DocumentCompleted", BindingFlags.Public) – linquize

Смежные вопросы