【100分】(不够另贴加分) 如何在不知道事件处理方法的前提下,移除事件处理方法

CsToD 2008-08-21 08:58:41
上次我问了个类似的问题:
http://topic.csdn.net/u/20080731/12/abedaf2c-f959-4039-ac21-d76b77fa0a98.html
已经由ojlovecd解决,在此再次感谢!

但是自定义事件跟WinForm里的预定义事件在实现上有区别,上次的解决方法解决不了自定义事件的情况


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
oth.Eve += new Action(Method3);
}
void Method3()
{
MessageBox.Show("3");
}
Other oth = new Other();
private void button1_Click(object sender, EventArgs e)
{
oth.Eve -= Method3;//Method3可见,直接移除
//Other是引用的其他类库,根本不知道Eve订阅了哪些方法
}
private void button2_Click(object sender, EventArgs e)
{
oth.Begin();
}
}
class Other//此类不能修改!
{
public Other()
{
Eve += new Action(Method1);
Eve += new Action(Method2);
}
public event Action Eve;
public void Begin()
{
if (Eve != null)
Eve();
}
void Method1()
{
MessageBox.Show("1");
}
void Method2()
{
MessageBox.Show("2");
}
}


如上,Other类是引用别的类库,没有源代码,不能修改
Form1是自己写的,可以任意修改

在button2的单击事件中我引发了oth的Eve事件
我希望在button1的单击事件中移除Eve事件的处理方法,使得单击button2不执行任何操作
由于Method3是在Form1中定义的,所以我可以直接移除
但是Method1,Method2却不行
我用反射的方法也没有找到解决办法

...全文
238 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
CsToD 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yagebu1983 的回复:]
小心把你的号给封了!!
[/Quote]
我咋了?

见者有份好了~~
好,见者有份
结贴!
我姓区不姓区 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 CsToD 的回复:]
引用 7 楼 ojlovecd 的回复:
看到有人提到我的名字,进来看看,顺便蹭分^_^

没进来之前你看不到我提你的名字吧?

100分是全给你呢?还是给LQknife分20?
[/Quote]
对,应该改改:进来看看,看到有人提到我的名字,顺便蹭分^_^

分是你的,你自己决定,这个贴我没出任何力,按理说不应该得分的,见者有份好了~~
赵一一 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Player26 的回复:]
引用 2 楼 CsToD 的回复:
已解决:
C# codeprivatevoidbutton1_Click(objectsender, EventArgs e)
{
EventInfo ei=oth.GetType().GetEvent("Eve");
FieldInfo fi=oth.GetType().GetField("Eve", BindingFlags.NonPublic ¦BindingFlags.Instance);
Action act=(Action)fi.GetValue(oth);
ei.RemoveEventHandler(oth, act);//oth.Eve -= Method3;}

这10…
[/Quote]
yagebu1983 2008-08-21
  • 打赏
  • 举报
回复
小心把你的号给封了!!
CsToD 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ojlovecd 的回复:]
看到有人提到我的名字,进来看看,顺便蹭分^_^
[/Quote]
没进来之前你看不到我提你的名字吧?

100分是全给你呢?还是给LQknife分20?
GhostAdai 2008-08-21
  • 打赏
  • 举报
回复
把分都给老衲就没那么多烦恼了!
我姓区不姓区 2008-08-21
  • 打赏
  • 举报
回复
看到有人提到我的名字,进来看看,顺便蹭分^_^
LQknife 2008-08-21
  • 打赏
  • 举报
回复
委托有个GetInvocationList找到那个方法名 直接-= :-)
yagebu1983 2008-08-21
  • 打赏
  • 举报
回复
接分!!
萱哥老了 2008-08-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 CsToD 的回复:]
已解决:
C# codeprivatevoidbutton1_Click(objectsender, EventArgs e)
{
EventInfo ei=oth.GetType().GetEvent("Eve");
FieldInfo fi=oth.GetType().GetField("Eve", BindingFlags.NonPublic|BindingFlags.Instance);
Action act=(Action)fi.GetValue(oth);
ei.RemoveEventHandler(oth, act);//oth.Eve -= Method3;}

这100分咋办?

要不还是给ojlovecd?
[/Quote]
收藏 分钱得了
LQknife 2008-08-21
  • 打赏
  • 举报
回复
接分
应该可以移除委托列表中的某一个方法
CsToD 2008-08-21
  • 打赏
  • 举报
回复
已解决:

private void button1_Click(object sender, EventArgs e)
{
EventInfo ei = oth.GetType().GetEvent("Eve");
FieldInfo fi = oth.GetType().GetField("Eve", BindingFlags.NonPublic | BindingFlags.Instance);
Action act = (Action)fi.GetValue(oth);
ei.RemoveEventHandler(oth, act);
//oth.Eve -= Method3;
}


这100分咋办?

要不还是给ojlovecd?
Mittermeyer 2008-08-21
  • 打赏
  • 举报
回复
可以用Delegate.RemoveAll的方法试试看。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧