2014-10-03 243 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類型參數的接口,並投了接口類型來具體實現。