【问题标题】:How to disconnect an anonymous event? [duplicate]如何断开匿名事件? [复制]
【发布时间】:2010-09-20 22:47:23
【问题描述】:

可能重复:
How do I Unregister 'anonymous' event handler

我有这样的代码:

        Binding bndTitle = this.DataBindings.Add("Text", obj, "Title");
        bndTitle.Format += (sender, e) =>
        {
            e.Value = "asdf" + e.Value;
        };

我现在如何断开 Format 事件?

【问题讨论】:

    标签: c# visual-studio-2008 events disconnect


    【解决方案1】:

    很遗憾,你不能这样做。如果您在同一范围内删除事件,则可以创建一个本地来保存 lambda:

    Binding bndTitle = this.DataBindings.Add("Text", obj, "Title");
    EventHandler handler = (sender, e) =>
    {
        e.Value = "asdf" + e.Value;
    };
    
    bndTitle.Format += handler;
    // ...
    bndTitle.Format -= handler;
    

    【讨论】:

    • 您不能“无法将 lambda 表达式分配给隐式类型的局部变量”。它必须是 ConvertEventHandler handler = (sender, e) => { e.Value = "asdf" + e.Value; };
    • 而且由于你必须给它分配一个类型,它不能是匿名的。
    • @Richard Hein 你错了,方法可以是匿名的,但有一个类型(被转换为委托)。方法(lambda)的匿名性意味着它不能被名称引用。
    • @Audrey 是的,我说错了,你是对的。然而这不会编译。
    • 在这种情况下,Rx 非常有用。使用 Rx 你可以这样做: Binding bndTitle = this.DataBindings.Add("Text", obj, "Title"); var handler = Observable.FromEvent( h => new ConvertEventHandler(h), h => bndTitle.Format += h, h => bndTitle.Format -= h);一次性处理程序 = handler.Subscribe(e => e.EventArgs.Value = "asdf" + e.EventArgs.Value);然后你保留一个对disposableHandler的引用,并在你喜欢的时候调用Dispose()。
    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 2022-10-21
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多