2016-08-07 76 views
0

我正在寫一個定製的Timer,它擴展了DispatcherTimer。它有一個名爲TimerSetUp的方法,我將Tick事件關聯到一個EventHandler。在C中傳遞一個事件處理函數作爲參數#

public class MyTimer : DispatcherTimer 
{ 
    public MyTimer(){} 
    public void TimerSetUp(EventHandler<EventArgs> _EventHandler) 
    { 
     base.Tick += _EventHandler; 
    } 
} 

我現在有另一對夫婦類,StopwatchTimer和CountdownTimer,擴展MyTimer。讓我們看看CountdownTimer。

public class CountdownTimer : MyTimer 
{ 
    public CountdownTimer() 
    { 
     base.TimerSetUp(CountdownTimer_Tick); 
    } 

    public void CountdownTimer_Tick(object sender, EventArgs e) 
    { 
     //...do something 
    } 
} 

當其中一方的聲明,構造函數必須調用基類的方法 TimerSetUp和剛剛成立的事件處理程序。

的問題是,在TimerSetUp功能的簽名,它給了我這個錯誤

Cannot implicitly convert type 'System.EventHandler<System.EventArgs>' 
to'System.EventHandler<object> 

我不能擺脫它。如果我只是把TimerSetUp內CountdownTimer,只是直接分配的事件處理程序,這樣

base.Tick += CountdownTimer_Tick; 

它的工作原理,但我真的想使它工作的其他方式。 所以我想知道如果

1)有一個辦法可以解決這個

2)這是一個很好的方法來代碼的可擴展性?

+1

事件處理程序沒有EventArgs的 – Steve

+0

@Steve它給出了同樣的錯誤 –

+0

奇怪,我用你的代碼,只是刪除了''(不需要使用標準EventHandler委託)的''是,如果你提供所需的自己的EventArgs派生實例。 https://msdn.microsoft.com/en-us/library/db0etb8x(v=vs.110).aspx – Steve

回答

0

沒關係,我做到了。我只是在函數簽名中鑄造了一個通用對象,並在代碼中包裝了一個新的eventHandler。

public void TimerSetUp(EventHandler<object> _EventHandler) 
{ 
    base.Tick += new EventHandler<object>(_EventHandler); 
} 
+0

如果'_EventHandler'是'EventHandler '類型的,那麼爲什麼你需要將它包裝呢? – zerkms

+0

是的,那也是我的想法。我想Visual Studio對此有點困擾。 –

相關問題