对委托使用泛型类型约束的事件



我试图(在C#8.0中(实现一个具有泛型类型参数(对委托的约束(的类,该类具有相同泛型类型的事件参数。其目的是具有一些自定义事件处理(订阅和取消订阅功能(,同时仍然允许与之相关的任何类型的委托。

public class AEvent<T> where T : Delegate
{
private event T eventData;
public AEvent() { }
}

从上面的代码开始,IDE给了我这个错误:

'eventData':事件必须是委托类型

有人能简要解释一下为什么我不能实现它吗?或者是否有其他方法可以实现这一点?

C#规范明确表示这是不允许的(我的粗体(

事件

事件声明的类型必须是delegate_type。。。。

代表

声明委托类型的唯一方法是通过delegate_declaration。委托类型是派生自System.Delegate的类类型。。。狙击注意,System.Delegate本身不是委托类型;它是派生所有委托类型的类类型。

正如其他人所提到的,无论如何这样做都没有多大意义。无论你做什么,无论你如何生成它,你都无法指定arity(要传递多少参数(,所以你将无法调用它。

你最好的选择是使用Action<T>EventHandler<TEventArgs>,这样你至少知道参数的数量,并且可以对其余部分使用泛型

您将如何引发事件?您不知道委托是否需要参数,以及需要多少个参数和哪种类型的参数。我将使用类AEventAEvent<T>AEvent<T1,T2>等,并分别使用ActionAction<T>Action<T1,T2>声明事件。

public class AEvent
{
private event Action eventData;
}
public class AEvent<T>
{
private event Action<T> eventData;
}
public class AEvent<T1, T2>
{
private event Action<T1, T2> eventData;
}
...

最新更新