0

それがC#で可能かどうかはわかりませんが、強い型の「sender」引数を持つ抽象クラスでイベントを発生させたいと思います。

私のコードがあります

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句を操作することでそれは可能ですか?

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 に答える