c# - 取消订阅其类型参数在泛型方法中指定的泛型类的事件

标签 c# generics events unsubscribe

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

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

最佳答案

在单独的委托(delegate)中捕获取消订阅并在处理时执行它:

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<Action> 中收集取消订阅处理程序并在 dispose 上执行它们。

关于c# - 取消订阅其类型参数在泛型方法中指定的泛型类的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631952/

相关文章:

c# - EF4 对象状态管理器声称在没有附加条目时附加了多个条目

c# - (C#) 通过串行发送十六进制

c# - 如何使用 Nunit 断言每个集合项

java - Java 泛型字段类型不能像泛型方法类型那样具体吗?

.net - VB.Net - 将处理程序添加到未知类型的对象?

c# - .NET 核心 2.1 和 EF 框架 2.1

java 未绑定(bind)通配符 <?> 与 <T>

delphi - 使用继承的接口(interface)作为 TDictionary 中的键

windows - 如何注册为 NT 内核事件的实时 ETW 使用者?

c# - 事件作为方法返回值,是否正确?