簡體   English   中英

在C#中將事件處理程序作為參數傳遞

[英]Passing an event handler as argument in C#

我正在編寫一個自定義的Timer,它擴展了DispatcherTimer。 它有一個稱為TimerSetUp的方法,在該方法中,我將Tick事件與EventHandler關聯。

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)這是代碼擴展的好方法嗎?

沒關系,我做到了。 我只是在函數簽名中強制轉換了一個通用對象,並在代碼內包裝了一個新的eventHandler。

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

DispatchTimer.Tick似乎是非通用的EventHandler而不是EventHandler<EventArgs> 由於無論如何都使用基本EventArgs ,因此它們在功能上是等效的:

public void TimerSetUp(EventHandler _EventHandler)
 {
     base.Tick += _EventHandler;
 }

請參閱: https : //msdn.microsoft.com/zh-cn/library/system.windows.threading.dispatchertimer.tick(v=vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM