2013-07-15 89 views
1

我有以下代碼試圖在運行時附加一個通用的事件處理程序:爲什麼我無法使用EventHandler處理EventHandler <XXX>?

EventInfo info = source.GetType().GetEvent("EventWithArgsInheritingFromEventArg"); 
info.AddEventHandler(source, new EventHandler((obj, args) => DoSomething())); 

當我嘗試這樣做,我得到以下異常:

類型的「對象System.EventHandler '無法轉換爲類型 'System.Windows.Controls.DataGridSortingEventHandler'。

我的理解是,具有簽名(對象發件人,EventArgs e)的方法可以處理帶有從EventArgs繼承的參數的任何事件嗎?

我的方法有什麼問題?

感謝

編輯:可這有什麼區別? DaraGridSortingEventHandler不會從EventHandler繼承嗎?

enter image description here

+0

也許這就是協方差/逆變廢話?這聽起來好像某個地方有從EventHandler向DataGridSortingEventHandler的倒下.. –

+0

@LewsTherin:可能是。當我必須處理這些術語時,我總是頭疼...... –

+0

我也是:(爲了嘗試解決它,也許你應該發送一個派生類型的DataGrid的事件處理函數 –

回答

1

使用AddEventHandler方法不能使用不同的代表,而是一個解決方法是使用Delegate.CreateDelegate首先創建一個委託:

EventInfo info = source.GetType().GetEvent("EventWithArgsInheritingFromEventArg"); 

// create the event handler 
var eventhandler = new EventHandler(this.DoSomething); 

// create a delegate from the EventHandler 
var @delegate = Delegate.CreateDelegate(info.EventHandlerType, null, eventhandler.Method); 

info.AddEventHandler(source, @delegate); 
+0

太棒了。它的工作原理。它有點奇怪,它呢? –