要在运行时抛出异常或显示消息框,您有以下选项:
- 隐藏
Shown
事件并在add
部分中抛出异常(除非已设置跳过标志)。
- 使用反射查找事件的事件处理程序列表
Shown
并检查是否有附加到事件的处理程序。
在这两种解决方案中,都可以使用布尔属性来覆盖派生形式中的行为。
选项 1 - Shadowing Shown 事件并将代码添加到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;
}
}
Shown
选项 2 - 查找事件的事件处理程序列表
作为运行时的一个选项,您可以覆盖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);
}
}