小编Pau*_*een的帖子

我可以使用反射取消订阅系统事件吗?

我需要创建一个 RichTextBox 子类,除了它不订阅 UserPreferenceChanged 之外,它在所有方面的工作方式都相同。此事件导致我的应用程序挂起。我必须使用 RichTextBox,并且无法将其交换为 MultiLine=True 的 TextBox 或其他类似的内容。

这是System.Windows.Forms.RichTextBox 订阅的地方;

protected override void OnHandleCreated(EventArgs e)
{
    ...
    SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(this.UserPreferenceChangedHandler);
}
Run Code Online (Sandbox Code Playgroud)

这是处理程序的签名;

private void UserPreferenceChangedHandler(object o, UserPreferenceChangedEventArgs e)
Run Code Online (Sandbox Code Playgroud)

该处理程序不是虚拟的,因此我无法覆盖它。该处理程序是私有的,因此我无法执行简单的-=来取消订阅。我已经研究过使用反射来删除处理程序,但我无法让它工作 - 这就是我到目前为止所拥有的;

public partial class MyRichTextBox : RichTextBox
{
    ...

private void UnsubscribeUserPreferenceChanged()
{
    FieldInfo fieldInfo = typeof(SystemEvents).GetField("OnUserPreferenceChangedEvent", BindingFlags.NonPublic | BindingFlags.Static);
        // fieldInfo.ToString() = "System.Object.OnUserPreferenceChangedEvent"
    object eventObj = fieldInfo.GetValue(this);
        // eventInfo.ToString() = "System.Object"
    PropertyInfo propInfo = typeof(RichTextBox).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
        // propInfo.ToString() = "System.ComponentModel.EventHandlerList Events"
    EventHandlerList …
Run Code Online (Sandbox Code Playgroud)

c# winforms

2
推荐指数
1
解决办法
890
查看次数

标签 统计

c# ×1

winforms ×1