将参数化委托强制转换为非参数化模拟

本文关键字:参数 模拟 转换 | 更新日期: 2023-09-27 17:53:18

谁能建议为什么我不能用适当的类型参数将非泛型委托转换为泛型?特别是有如下所示的两个委托

  1. public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs e)
  2. public delegate void WeakEventHandler<TSource, TEvent>(TSource sender, TEvent e)

和委托变量

  • NotifyCollectionChangedEventHandler handler;
  • 我不能将处理程序转换为WeakEventHandler<object, NotifyCollectionChangedEventArgs>。有人知道这是什么原因吗?

    将参数化委托强制转换为非参数化模拟

    简单地说,它们是不同的类型。假设您有两个这样的类:

    public class A1
    {
        public int Value { get; set; }
    }
    public class A2
    {
        public int Value { get; set; }
    }
    

    它们是不同的类,尽管看起来是等价的——而且你不能在A1A2之间进行强制转换。委托也是一样。

    可以做的是包装现有的委托:

    var weakHandler = new WeakEventHandler<object, NotifyCollectionChangedEventArgs>(handler);
    

    创建一个新的委托,该委托在调用新委托时调用原始委托。