Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口中的泛型事件参数_C#_Generics_C# 4.0 - Fatal编程技术网

C# 接口中的泛型事件参数

C# 接口中的泛型事件参数,c#,generics,c#-4.0,C#,Generics,C# 4.0,我试图将对象保存在一个泛型EventArgs类中,但由于EventHandler有一个接口,所以我很难实现这一点。有没有办法让这样的东西起作用 我的EventArgs类: public class PositionChangedEventArgs<T> { public PositionChangedEventArgs(byte position, T deviceArgs) { Position = position; DeviceArgs

我试图将对象保存在一个泛型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; }
}
公共类PositionChangedEventArgs
{
公共位置ChangedEventArgs(字节位置,T设备Args)
{
位置=位置;
DeviceArgs=DeviceArgs;
}
公共字节位置{get;private set;}
公共T设备args{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
}
公共类SomeDevice:IMoveable
{
public EventHandler PositionChanged;//编译器不喜欢这样
}

您需要将接口定义更改为以下内容:

public interface IMoveable<T>
{
    event EventHandler<PositionChangedEventArgs<T>> PositionChanged;
}
公共接口不可移动
{
事件处理程序位置已更改;
}
您可以通过将类型传递给接口来使用它,如下所示:

public class SomeDevice : IMoveable<DeviceSpecificEventMessageArgs>
{
   public event EventHandler<PositionChangedEventArgs<DeviceSpecificEventMessageArgs>> PositionChanged; 
}
公共类SomeDevice:IMoveable
{
公共事件处理程序已更改;
}

这是因为必须将接口声明为泛型:

public interface IMoveable<T>
{
    event EventHandler<PositionChangedEventArgs<T>> PositionChanged;
}
公共接口不可移动
{
事件处理程序位置已更改;
}

。您让接口使用一个泛型参数定义一个事件,在实际具体实现该事件时无法定义该泛型参数。如果将整个接口设置为该T的泛型,则可以通过表示正在为事件arg类型实现整个接口来关闭泛型。