C# 如何";“解除绑定”;当I';m在派生类中?
我曾经遇到过一种情况,我必须重写我的某个派生类中的事件处理程序。不幸的是,我不能“重写”它,因为实现逻辑严格地绑定到基类中的特定方法实现 我的自然想法是首先从事件中“解除”原始事件处理程序的绑定,然后绑定我自己的全新方法。所以我尝试使用“-=”操作符,比如:C# 如何";“解除绑定”;当I';m在派生类中?,c#,event-handling,C#,Event Handling,我曾经遇到过一种情况,我必须重写我的某个派生类中的事件处理程序。不幸的是,我不能“重写”它,因为实现逻辑严格地绑定到基类中的特定方法实现 我的自然想法是首先从事件中“解除”原始事件处理程序的绑定,然后绑定我自己的全新方法。所以我尝试使用“-=”操作符,比如: myObject.SomeEvent -= new EventHandler (BaseClass.SomeEventHandler) 此时,编译器抱怨它无法访问私有方法SomeEventHandler。因为基类是库的一部分,所以我并不想
myObject.SomeEvent -= new EventHandler (BaseClass.SomeEventHandler)
此时,编译器抱怨它无法访问私有方法SomeEventHandler。因为基类是库的一部分,所以我并不想修改它的实现(尽管看起来很简单,只是把“private”变成了“protected”)
将事件处理程序附加到事件非常简单。为什么除掉一个这么难
我为什么想要它?因为基本实现是在处理一些问题(只是没有处理我们的特殊情况),所以我想重新定义它。但是,即使在我附加了事件处理程序之后,基本实现还是会被执行。因为它在做某种重定向,所以我自己的实现永远不会运行,因为重定向后请求处理在服务器上被破坏
是否可以在不修改其实现的情况下从库中删除基类中的事件处理程序?如果代码可以正式看到该处理程序,那么删除该处理程序也同样容易。如果绝对必要,可以使用反射取消订阅以获得代理,但这很麻烦。a:避免该要求或b:更改代码以使处理程序受保护
,都会更干净、更安全
反思方法(自担风险使用);取消注释
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();
}
}
难道没有一种方法可以在没有访问权限的情况下除去所有附加的处理程序吗?就让系统偷偷地从你那里识别并解开它们吧?你会好心地展示如何使用反射吗?