1

私は渡すデータオブジェクトを持っています:

public class TimedResult<T>
{
    public ResultRequest Request { get; set; }
    public T Data { get; set; }
    public TimeSpan TimeTaken { get; set; }
}

私の Manager クラスでは、イベントを発生させるいくつかの作業が行われています:

public void Execute(ResultRequest request)
{
    var result = new TimedResult<DataTable>();
    // fill data object here
    OnResult(result);
}

OnResultメソッドをジェネリックにしました:

protected virtual void OnResult<T>(TimedResult<T> result)
{
    if (Result != null)
        Result(this, result);
}

しかし、イベント宣言をジェネリックにするにはどうすればよいでしょうか?

public event EventHandler<TimedResult<T>> Result; // red line under T

これをどのように行う必要がありますか?

4

2 に答える 2

2

イベント宣言は(オープン) ジェネリックにすることはできません。宣言する型のジェネリック型パラメーターを使用できますが、独自のジェネリック パラメーターを宣言することはできません。したがって、宣言する型に(直接または外部型を介して)ある場合、つまり次の場合にのみ、必要なものが可能にResultなりTますSomeManager<T>

class SomeManager<T> {
     public event EventHandler<TimedResult<T>> Result;
}

次に、Tそれは上からのものです。その中SomeManager<int>には、などがEventHandler<TimedResult<int>>あります。

于 2014-10-03T10:28:01.463 に答える
2

しかし、イベント宣言をジェネリックにするにはどうすればよいでしょうか?

public event EventHandler<TimedResult<T>> Result; // red line under T

イベント全体を宣言するクラスもジェネリックにする必要があります (つまり、ジェネリック型パラメーターを持つ必要があります)。

public class X<TEventData>
{
    public event EventHandler<TimedResult<TEventData>> Result; // red line under T
}

ここで、要件に応じて、これが機能するかどうかが決まります。これは、複数のイベント データ型でイベントを発生させることを探している場合は、リフレクションを使用してイベントを発生させることで解決できる可能性があるためです (これは避けてください)。

または、特定のイベント データが一部のメンバーを共有することを定義するインターフェイスを設計し、そのインターフェイスをX<TEventData> TEventData型引数として指定し、イベント ハンドラーで必要な場合はインターフェイス型を具体的な実装にキャストすることをお勧めします。

于 2014-10-03T10:29:30.893 に答える