C# 从委托本身r.e事件处理程序中访问委托

C# 从委托本身r.e事件处理程序中访问委托,c#,winforms,delegates,C#,Winforms,Delegates,我正在将一个委托分配为事件处理程序,在这个委托中,我也需要删除作为处理程序的委托,例如 wb.DocumentCompleted += delegate(object sender_, WebBrowserDocumentCompletedEventArgs e_) { if (condition) { wb.DocumentCompleted -= this; } }; 以上是错误代码 无法将“x.Form1”隐式转换为“System.Windows.

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

wb.DocumentCompleted += delegate(object sender_, WebBrowserDocumentCompletedEventArgs e_)
{
    if (condition)
    {
        wb.DocumentCompleted -= this;
    }
};
以上是错误代码

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

我该怎么做?
感谢您的帮助。

假设对象发送者是此wb对象

 wb.DocumentCompleted -= YOUR DELEGATE HERE
但是,对于匿名委托,如果不首先将其分配给变量,则不可能实现这一点。因此,假设可以将委托分配给变量

 var del = delegate(object sender....
 wb.DocumentCompleted += del
这是匿名函数的经典警告,一般来说,您必须在某个点缓存对它的引用,以便再次引用它,在本例中,指定将其删除

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

但是,如果要删除事件上的所有EventHandler,则只需调用

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

事实上,这里有一个问题正是你所问的


是否缺少部分错误?在添加和删除委托时,您是否已经尝试使用方法而不是匿名方法?@Giulio Caccin我需要一个内联委托,因为代码需要在for循环中更改,动态事件处理程序需要动态生成components@BinkyNichols请在此处检查答案: