Поведение .NET Inject при запуске события

#.net #design-patterns

#.net #шаблоны проектирования

Вопрос:

Итак, у меня есть метод, который я хочу вызывать каждый раз, когда определенный объект, в данном случае a Form , вызывает определенное событие, в данном случае FormClosing . Теперь, что я мог бы сделать, это создать, MyForm который наследует Form , а затем делает то, что мне нужно, что-то вроде

 //Not Sure if this is 100% how you would do this but you get the idea
private void formClosing(Object sender, FormClosingEventArgs e)
{
    MyMethod(this);
    RaiseEvent MyFormClosing;
}
  

Однако, что, если я не хочу делать вышеупомянутое. Существует ли какая-либо структура или шаблон, которые в принципе позволили бы мне внедрить желаемое поведение в код?

Если это недостаточно ясно, я могу объяснить подробнее.

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

1. Почему вы не подписываетесь на событие?

2. @Haplo, это не совсем то, о чем я спрашиваю, это не только для одного объекта. Это было бы для всех объектов, унаследованных от базового типа.

Ответ №1:

Будет ли достаточно добавить свойство, которому вы можете присвоить значение true или false, к классу MyForm, чтобы указать ему не вызывать метод? Лично я бы переопределил метод закрытия, а не подписался на событие.

 protected override void OnFormClosing(FormClosingEventArgs e)
{
   if(CallMyMethod)
   {
       MyMethod(this);
   }

   base.OnFormClosing(e);
}
  

Если myMethod является внешним по отношению к форме, вы можете вместо этого использовать делегаты (возможно, также лучшее именование)

 public Action<Form> MyMethod { get; set; }
protected override void OnFormClosing(FormClosingEventArgs e)
{
   if(MyMethod != null)
   {
       MyMethod(this);
   }

   base.OnFormClosing(e);
}
  

но на самом деле, поскольку это форма, если вы хотите вызвать внешний метод, было бы лучше подписаться на событие закрытия форм.

** Правка операции **

Это было достаточно близко, чтобы привести меня к тому, к чему я хотел, а именно к созданию частичного класса, унаследованного от Form , и переопределению событий там, чтобы делать то, что я хотел.

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

1. Я пытаюсь избежать использования базового класса. В принципе, я хочу иметь возможность внедрять такое поведение в класс по умолчанию Form .

2. это фактически привело меня туда, куда я хотел пойти. Я отредактировал то, что я сделал в вашем ответе