2014-10-03 244 views
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 

我应该怎样做呢?

+0

'T'从哪里来?它应该是班级定义的一部分'class Manager ' – 2014-10-03 10:23:38

+0

@lc。好的问题,我对泛型不太熟悉,我想我要做的就是能够使用相同的'OnResult'方法和事件返回'TimedResult '以及'TimedResult '。 – sprocket12 2014-10-03 10:25:40

+0

@Muhammad然后你最好的选择就是使用'object',即'public event EventHandler > Result;'; p – 2014-10-03 10:29:38

回答

2

活动声明不能是(开放)通用。他们可以使用从声明类型中使用泛型类型参数,但他们不能声明他们自己的泛型参数。所以,你想的是,如果声明Result类型具有唯一可能的一个T(直接或通过外部型),即如果这是SomeManager<T>

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

那么T是不管它是从上面;在SomeManager<int>这将是一个EventHandler<TimedResult<int>>等等。

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类型参数的接口,并投了接口类型来具体实现。