【问题标题】:Can i ignore code from an Event using lambda expression我可以使用 lambda 表达式忽略事件中的代码吗
【发布时间】:2020-11-03 17:40:26
【问题描述】:

有上下文:

Class A{
  public void mymethod(){
    MyWindow window = new MyWindow();
    window.Show();
  }
}
public partial class MyWindow: Window
{
   private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
   {
     //Some Code Here
   }

}

我可以在 MyMethod 中执行:MyWindow.Closing -= (_,__) => {}; 以忽略 Window_Closing 中写入的代码吗?

【问题讨论】:

  • 何不试试呢?
  • 为什么你有一个不想执行的事件处理程序?
  • @HimBromBeere 我无法进行测试,因为当我问这个问题时我没有可用的开发环境。 (通过我的手机询问)
  • @HimBromBeere 并且对于一个非常具体的情况,由于MyWindow内部无法处理的异常,在这种情况下不应该保存使用事件保存的数据。

标签: c# wpf events


【解决方案1】:

不,这是不可能的。 事件是多播委托,这意味着事件包含回调集合,这就是语法+=-= 而不仅仅是= 的原因。 C# 中的事件以不同的方式编译,它们“似乎”在代码中。在暴露事件的类的外部,唯一可以完成的操作是添加和删除回调。在声明事件的类中,可以使用其他操作(调用事件回调、访问注册列表...),但这是另一个主题。

要删除已添加的回调,您需要引用该特定回调,在您的情况下,每个 MyWindow 实例是 MyWindow.Window_Closing,该方法现在是私有的,因此您不能。 如果MyWindow.Window_Closing 是公开的,您可以这样做:

window.Closing -= window.Window_Closing

但这仅适用于该回调,如果其他类也订阅了他们将收到通知的事件,则您无法从声明事件的类外部访问所有回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多