Могу ли я игнорировать код из события, используя лямбда-выражение

#c# #wpf #events

#c# #wpf #Мероприятия

Вопрос:

Существует контекст:

 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 ?

Комментарии:

1. почему бы не попробовать это?

2. почему у вас есть обработчик событий, который вы не хотите выполнять?

3. @HimBromBeere Я не смог выполнить тест, потому что у меня не было доступной среды разработки, когда я задавал вопрос. (спрашивается с моего телефона)

4. @HimBromBeere И для очень конкретного случая, из-за исключения, которое не может быть обработано внутри MyWindow, данные, сохраненные с использованием событий, не должны сохраняться в этом случае.

Ответ №1:

Нет, это невозможно. События являются делегатами многоадресной рассылки, что означает, что событие содержит набор обратных вызовов, поэтому синтаксис = и -= и не только = . События в C # компилируются не так, как они «кажутся» в коде. Внешне по отношению к классу, раскрывающему событие, единственными операциями, которые могут быть выполнены, являются добавление и удаление обратных вызовов. Внутри класса, объявляющего событие, доступны другие действия (вызов обратных вызовов событий, доступ к списку регистраций …), Но это уже другая тема.

Чтобы удалить уже добавленный обратный вызов, вам необходимо иметь ссылку на этот конкретный обратный вызов, который в вашем случае предназначен MyWindow.Window_Closing для каждого MyWindow экземпляра, метод на данный момент является закрытым, поэтому вы не можете. Если MyWindow.Window_Closing было общедоступным, вы могли бы сделать:

 window.Closing -= window.Window_Closing
  

Но это сработало бы только для этого обратного вызова, если бы другие классы также были подписаны на событие, о котором они будут уведомлены, вы не можете получить доступ ко всем обратным вызовам извне класса, объявляющего событие.