我试图(在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>
,这样你至少知道参数的数量,并且可以对其余部分使用泛型
您将如何引发事件?您不知道委托是否需要参数,以及需要多少个参数和哪种类型的参数。我将使用类AEvent
、AEvent<T>
、AEvent<T1,T2>
等,并分别使用Action
、Action<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;
}
...