当前位置:  开发笔记 > 编程语言 > 正文

当我在派生类中时,如何"取消绑定"附加到基类中的事件的事件处理程序?

如何解决《当我在派生类中时,如何"取消绑定"附加到基类中的事件的事件处理程序?》经验,为你挑选了1个好方法。

我曾经遇到过一种情况,我不得不在我的某个派生类中覆盖事件处理程序.遗憾的是,我不能"覆盖"它,因为实现逻辑严格地绑定到基类中的特定方法实现.

我的自然想法是首先从事件中"取消绑定"原始事件处理程序,然后绑定我自己的全新方法.所以我尝试使用" - ="运算符,如:

myObject.SomeEvent -= new EventHandler (BaseClass.SomeEventHandler)

此时编译器抱怨它无法访问私有方法SomeEventHandler.由于基类是库的一部分,我真的不想修改它的实现(尽管只是因为它似乎只是将"私有"变成"受保护");

将事件处理程序附加到事件非常简单.为什么摆脱一个这么难?

为什么我想要它?因为基本实现存在一些问题(只是没有处理我们的特定情况)所以我想重新定义它.但即使在我附加了我的事件处理程序之后,基本实现仍然会被执行.由于它正在进行某种重定向,因为重定向后请求处理在服务器上被破坏,我自己的实现永远不会运行.

反正有没有从库中删除基类中的事件处理程序而不修改它的实现?



1> Marc Gravell..:

是一样容易摆脱处理程序,如果你的代码就可以正式看到了处理程序.如果绝对必要,可以使用反射取消订阅以获取代理,但这很麻烦.这将是一个很多更清洁,更安全,无论是:避免的要求,或b:更改代码,使处理程序protected.


反思方法(自担风险使用); 取消注释该块Bar.ctor()以查看更改.

using System;
class Foo
{
    public event EventHandler SomeEvent;
    public Foo()
    {
        SomeEvent += SecretHandler; // a bad idea, anyway
                                    //(self-subscribed events....)
    }
    protected virtual void OnSomeEvent()
    {
        EventHandler handler = SomeEvent;
        if (handler != null) handler(this, EventArgs.Empty);
    }
    private void SecretHandler(object sender, EventArgs args)
    {
        Console.WriteLine("suscribed");
    }
}
class Bar : Foo
{
    public Bar()
    {
        /*
        MethodInfo method = typeof(Foo).GetMethod("SecretHandler",
            BindingFlags.NonPublic | BindingFlags.Instance);
        EventHandler handler = (EventHandler)Delegate.CreateDelegate(
            typeof(EventHandler), this, method);
        SomeEvent -= handler;
         */
    }
    public void Test()
    {
        OnSomeEvent();
    }
}
static class Program
{
    static void Main()
    {
        Bar bar = new Bar();
        bar.Test();
    }
}

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有