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请在此处检查答案: