【问题标题】:Unsubscribe from an event of a generic class whose type parameter is specified within a generic method取消订阅类型参数在泛型方法中指定的泛型类的事件
【发布时间】:2018-09-12 21:22:43
【问题描述】:

如何退订泛型类的事件,其类型参数在泛型方法中指定如下?

public class ListLayoutControl : Control
{
    NotifyCollectionChangedEventHandler handler = null;

    public void AttachTo<T, U>(T list) where T : INotifyCollectionChanged, ICollection<U>
    {
        handler = delegate (object sender, NotifyCollectionChangedEventArgs e)
        {
            UpdateLayout(list.Count);
        };
        list.CollectionChanged += handler;
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            // unsubscribe ??
        }
        base.Dispose(disposing);
    }
}

【问题讨论】:

  • 这里的问题是我不能保留对泛型类的引用,因为它的类型参数是在泛型方法中定义的。所以没有参考取消订阅。我是使用 lambda 还是委托都没关系。
  • 编辑使用代表来澄清我的观点。
  • @Sinatr 无论您使用匿名方法还是 lambda,都没有区别。使用匿名方法只是做同样事情的更冗长和过时的语法,并且对您取消订阅事件的能力没有影响。您只需链接到在 lambda 存在之前发布的问题/答案,这就是它使用匿名方法的原因。
  • @Sinatr 是的,我知道这一点,因此我回应了您完全不正确的陈述,即 lambda 与匿名方法有任何不同。使用 lambda 解决这个问题与使用匿名方法没有什么不同。您让 OP 编辑​​问题,只让他们的代码使用过时的语法来完成他们正在做的事情,这在这种情况下没有任何优势,而且更加冗长,不必要。
  • @Sinatr 如果您使用 lambda 而不是匿名方法,该答案将完全相同工作。您不能使用 lambda 的声明完全是错误的。你当然可以。是的,您需要将该 lambda 存储在委托中(问题的原始修订已经在做),但是您可以使用 lambda 轻松地做到这一点,就像使用匿名方法一样(再次,如问题的第一次修订)。我知道您的评论不是答案,它只是一个不正确的陈述。

标签: c# generics events unsubscribe


【解决方案1】:

在单独的委托中捕获取消订阅并在处置时执行:

private Action _unsubscribeHandler;
public void AttachTo<T, U>(T list) where T : INotifyCollectionChanged, ICollection<U>
{
    NotifyCollectionChangedEventHandler handler = delegate (object sender, NotifyCollectionChangedEventArgs e)
    {
        UpdateLayout(list.Count);
    };
    list.CollectionChanged += handler;
    _unsubscribeHandler = () => {
        list.CollectionChanged -= handler;     
    };
}

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        _unsubscribeHandler?.Invoke();
    }
    base.Dispose(disposing);
}

如果可以使用不同的列表多次调用 AttachTo - 在 List&lt;Action&gt; 中收集取消订阅处理程序并在处置时全部执行。

【讨论】:

  • 像魅力一样工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多