Чтобы вызвать исключение или показать окно сообщения во время выполнения, у вас есть следующие опции:
- Затенение события
Shown
, а в части add
, исключение (если толькоустановлен флаг пропуска). - Используя отражение, найдите список обработчиков событий для события
Shown
и проверьте, есть ли обработчик, присоединенный к событию.
В обоих решенияхлогическое свойство может использоваться для переопределения поведения в производных формах.
Вариант 1 - Отображение события теневого копирования и добавление кода в add
Вы можете затенитьСобытие Shown
и в метод доступа add
добавьте код для отображения окна сообщения или выбросите исключение, если к событию добавлен обработчик.
В следующем примере я добавил свойство ThrowExceptionOnSubscribingShownEvent
в базовую форму, которое по умолчанию равно true
, что означает исключение при подписке на событие Shown
.
public bool ThorwExceptionOnSubscribingShownEvent { get; set; } = true;
public new event EventHandler Shown
{
add
{
if (ThorwExceptionOnSubscribingShownEvent)
throw new InvalidOperationException("Shown event is deprecated.");
base.Shown += value;
}
remove
{
base.Shown -= value;
}
}
Вариант 2 - Поиск списка обработчиков событий для Shown
события
В качестве опции для времени выполнения вы можете переопределить метод OnShown
и, используя отражение, получить EVENT_SHOWN
поле и, используя его, получите список обработчиков события Shown
.Затем вы можете проверить, не является ли список обработчиков событий пустым, сгенерировать исключение.
В следующем примере я добавил свойство ThrowExceptionOnSubscribingShownEvent
к базовой форме, которое по умолчанию равно true
, что означает, что оно вызывает исключение при подписке на событие Shown
.Вы можете установить его на false
при необходимости в производных формах:
public partial class BaseForm : Form
{
public BaseForm()
{
InitializeComponent();
}
public bool ThrowExceptionOnSubscribingShownEvent { get; set; } = true;
protected override void OnShown(EventArgs e)
{
if (!DesignMode)
{
var EVENT_SHOWN = typeof(Form).GetField("EVENT_SHOWN",
BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(null);
var handlers = Events[EVENT_SHOWN]?.GetInvocationList();
if (ThrowExceptionOnSubscribingShownEvent && handlers?.Length > 0)
throw new InvalidOperationException("Shown event is deprecated.");
}
base.OnShown(e);
}
}