【问题标题】:Accessing a delegate from within itself r.e event handlers [duplicate]从自身内部访问委托 r.e 事件处理程序 [重复]
【发布时间】:2019-08-15 19:40:35
【问题描述】:

我正在分配一个委托作为事件处理程序,从这个委托中我也需要删除该委托作为处理程序,例如

wb.DocumentCompleted += delegate(object sender_, WebBrowserDocumentCompletedEventArgs e_)
{
    if (condition)
    {
        wb.DocumentCompleted -= this;
    }
};

以上是错误代码

无法将“x.Form1”隐式转换为“System.Windows.Forms.WebBrowserDocumentCompletedEventHandler”

我该怎么做? 任何帮助表示赞赏。

【问题讨论】:

  • 部分错误是否丢失?在添加和删除委托时,您是否已经尝试使用方法而不是匿名方法?
  • @Giulio Caccin 我需要一个内联委托,因为代码需要在 for 循环中更改,动态制作组件的动态事件处理程序
  • @BinkyNichols 在这里查看答案:stackoverflow.com/questions/35074591/…

标签: c# winforms delegates


【解决方案1】:

假设对象 sender_ 就是这个 wb 对象。

 wb.DocumentCompleted -= YOUR DELEGATE HERE

但是对于匿名委托,如果不先将其分配给变量,这是不可能的。所以假设可以将委托分配给变量

 var del = delegate(object sender....
 wb.DocumentCompleted += del

这是一般匿名函数的经典警告,您必须在某个时候缓存对它的引用以再次引用它,在这种情况下指定它以删除。

如果您想显式删除该委托而不是其他可能已经在该对象上的委托,这将是最低要求,如果有理由首先删除该委托,我希望这是您的目标因为事件处理程序内存泄漏在 c# 表单中不是问题

但是,如果您想删除事件中的所有事件处理程序,那么您可以简单地调用

 wb.DocumentCompleted = null;

取决于您的库和框架(在您的情况下,这似乎是 Windows 窗体) 您可能需要以不同的方式处理添加和删除事件处理程序。许多 C# 框架和版本之间的事件处理略有不同。 您可以参考许多堆栈溢出问题中的任何一个,以了解如何影响事件的事件处理程序列表 现在他们中的大多数都支持 -= 但反射也是一种选择

How to remove all event handlers from an event

How can I clear event subscriptions in C#?

How to remove a method from an Action delegate in C#

事实上,这里的问题正是你所问的。

Adding and Removing Anonymous Event Handler

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多