2011-02-22 26 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; 
}