【问题标题】:Event using a generic type constraint to a delegate对委托使用泛型类型约束的事件
【发布时间】:2022-01-16 22:02:32
【问题描述】:

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

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

    public AEvent() { }
}

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

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

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

【问题讨论】:

  • 你希望引发这个事件吗?请注意,例如Action&lt;T&gt;、Action&lt;T1, T2&gt;、Action&lt;T1, T2, T3&gt; ... 都继承自Delegate。
  • Delegate 本身不是委托类型,它是所有委托的基本类型

标签: c# events delegates generic-type-parameters


【解决方案1】:

C# 规范明确声明这是不允许的(我的粗体字)

Events

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

Delegates

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

正如其他人所提到的,无论如何,这样做并没有多大意义。无论您做什么,无论您如何对其进行泛化,您都无法指定 arity(要传递多少个参数),因此您将无法调用它。

最好的办法是使用Action&lt;T&gt; 或EventHandler&lt;TEventArgs&gt;,这样你至少知道参数的数量,其余的可以使用泛型。

【讨论】:

    【解决方案2】:

    您将如何举办活动?您不知道委托是否需要参数以及参数数量和类型。我会使用AEvent、AEvent&lt;T&gt;、AEvent&lt;T1,T2&gt; 等类,并分别使用Action、Action&lt;T&gt; 和Action&lt;T1,T2&gt; 声明事件。

    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;
    }
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多