2011-02-22 27 views
4

我試圖保存一個對象在一個通用的EventArgs類,但因爲EventHandler有一個接口,我很難完成這一點。任何方式來得到這樣的工作?通用事件參數界面

我EventArgs類:

public class PositionChangedEventArgs<T> 
{ 
    public PositionChangedEventArgs(byte position, T deviceArgs) 
    { 
     Position = position; 
     DeviceArgs = deviceArgs; 
    } 

    public byte Position { get; private set; } 
    public T DeviceArgs { get; private set; } 
} 

接口使用:

public interface IMoveable 
{ 
    event EventHandler<PositionChangedEventArgs<T>> PositionChanged; 
} 

實例類用法:

public class SomeDevice : IMoveable 
{ 
    public event EventHandler<PositionChangedEventArgs<DeviceSpecificEventMessageArgs>> PositionChanged; //Compiler doesn't like this 
} 

回答

9

您需要將接口定義更改爲以下:

public interface IMoveable<T> 
{ 
    event EventHandler<PositionChangedEventArgs<T>> PositionChanged; 
} 

你可以通過類型接口,像這樣使用它:

public class SomeDevice : IMoveable<DeviceSpecificEventMessageArgs> 
{ 
    public event EventHandler<PositionChangedEventArgs<DeviceSpecificEventMessageArgs>> PositionChanged; 
} 
+0

此。你有接口定義了一個具有泛型參數的事件,當實際實現具體的事件時無法定義該參數。如果您將整個接口設置爲T的通用接口,則可以通過聲明您正在實現事件參數類型的整個接口來關閉泛型。 – KeithS 2011-02-22 16:40:25

0

那是因爲你必須聲明接口通用:

public interface IMoveable<T> 
{ 
    event EventHandler<PositionChangedEventArgs<T>> PositionChanged; 
}