簡體   English   中英

C#具有繼承的事件的強類型“發送者”

[英]C# Strong typed “sender” of events with inheritance

我不確定在C#中是否可行,但我希望在一個帶有強類型“發送者”參數的抽象類中有事件。

有我的代碼

abstract class Base
{
    public degate void MyDelegate(Base sender, object arg);
    public event MyDelegate SomeEvent;

    protected void RaiseSomeEvent(object arg)
    {
        if (SomeEvent != null)
            SomeEvent(this, arg)
    }
}

class Derived : Base
{
    // ?
}

var obj = new Derived();
obj += EventHandler;

public void EventHandler(Derived sender, object arg)
{

}

那么可以通過操縱generic where子句來做到這一點嗎?

你絕對可以把它變成通用的 - 但在你給出的情況下,你真的不想這樣做。

Base.SomeEvent不“知道”(在編譯時)它是什么類型 - 所以你不能讓它依賴於某種類型參數,它將是“正確的類型”。 可以做一些可怕的事情:

abstract class Base<T> where T : Base
{
    delegate void MyDelegate(T sender, object arg);

    public event MyDelegate SomeEvent;

    protected void RaiseSomeEvent(object arg)
    {
        if (SomeEvent != null)
            SomeEvent((T) this, arg)
    } 
}

(您可能需要(T) (object) this以保持編譯器滿意。)

接着:

class Derived : Base<Derived>

但它變得非常丑陋,沒有什么可以阻止這種情況發生:

class Evil : Base<Derived>

此時,在引發事件時,強制轉換將失敗。

我建議如果你真的想確定發送者是正確的類型,你可以忽略sender參數並捕獲你首先用於訂閱的變量:

Derived derived = new Derived();
derived.SomeEvent += (ignored, arg) => DoSomething(derived, arg);

暫無
暫無

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

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