0

我不确定这在 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)
{

}

那么,例如通过操作通用 where 子句可以做到这一点吗?

4

1 回答 1

2

你绝对可以让它通用 - 但在你给出的情况下你不会真的想要。

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);
于 2012-06-28T21:23:16.007 回答