2012-02-29 70 views
3

我想創建這個簡單的界面。我想以某種方式能夠發起一個事件。 這是我到現在爲止(不編譯,只是我的想法)TDelegate作爲事件的通用接口?

public interface IAsyncSearch<TTermType, TResultsEventType> 
               where TResultsEventType:delegate 
{ 
    event TResultsEventType SearchCompletedEvent; 
    void SearchAsync(TTermType term); 
} 

是類似的話甚至可能嗎?我知道在where語句中預計會有一種類型。

回答

2

試試這個

public interface IAsyncSearch<TData, TArgs> 
{ 
    event EventHandler<SpecialDataEventArgs<TArgs>> SearchCompletedEvent; 
    void SearchAsync(TData term); 
} 

public class SpecialDataEventArgs<T> : EventArgs 
{ 
    public SpecialDataEventArgs(T data) 
    { 
     Data = data; 
    } 

    public T Data { get; private set; } 
} 
+1

或者,也許只是使用'事件處理'同時限制'TEvenetArgs:EventArgs'。 – svick 2012-02-29 11:35:12

+0

我的解決方案適用於有很多參數的情況 – 2012-02-29 11:36:25

1

事件僅適用於委託類型。而且無法將類型參數約束爲C#中的委託。因此,我不認爲你想在C#中可能。

According to Jon Skeet,它實際上可能在CIL中做到這一點,所以也許如果你在CIL中編寫這種類型,你可以按照你想要的方式從C#中使用它。

編輯:你可以在CIL中創建這樣的類型,但似乎你不能在C#中使用它的屬性。看來你不能實現它。並且使用+=調用事件方法也不起作用。但使用add_SearchCompletedEvent調用它們確實有效。

2

所有類型的事件應該從事件處理程序<>,標準.NET事件處理程序類型推導。幫助任何讀取你的代碼的人快速識別它。更不宜在這裏,它很容易解決您的問題:

public interface IAsyncSearch<TTermType, TResultsArgType> 
     where TResultArgType : EventArgs 
    { 
     event EventHandler<TResultsArgType> SearchCompletedEvent; 
     void SearchAsync(TTermType term); 
    }