1

我有一个传递的数据对象:

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

在我的经理类中,我完成了一些引发事件的工作:

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 回答