首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 【100分】(不够另贴加分) 如何在不知道事件处理方法的前提下,移除事件处理方法 [已结贴,结贴人:CsToD]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CsToD
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-21 08:58:41 楼主
    上次我问了个类似的问题:
    http://topic.csdn.net/u/20080731/12/abedaf2c-f959-4039-ac21-d76b77fa0a98.html
    已经由ojlovecd解决,在此再次感谢!

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


    C# code
    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却不行
    我用反射的方法也没有找到解决办法

    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mittermeyer
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:12:291楼 得分:5
    可以用Delegate.RemoveAll的方法试试看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CsToD
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:16:152楼 得分:0
    已解决:
    C# code
    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?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:18:393楼 得分:25
    接分
    应该可以移除委托列表中的某一个方法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Player26
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:19:354楼 得分:5
    引用 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?

    收藏 分钱得了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:20:275楼 得分:10
    接分!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • LQknife
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:20:586楼 得分:0
    委托有个GetInvocationList找到那个方法名 直接-= :-)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojlovecd
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:34:497楼 得分:0
    看到有人提到我的名字,进来看看,顺便蹭分^_^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • GhostAdai
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:43:128楼 得分:5
    把分都给老衲就没那么多烦恼了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CsToD
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:43:579楼 得分:0
    引用 7 楼 ojlovecd 的回复:
    看到有人提到我的名字,进来看看,顺便蹭分^_^

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

    100分是全给你呢?还是给LQknife分20?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:46:1210楼 得分:0
    小心把你的号给封了!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linnyn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:47:2611楼 得分:0
    引用 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…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ojlovecd
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:48:4712楼 得分:50
    引用 9 楼 CsToD 的回复:
    引用 7 楼 ojlovecd 的回复:
    看到有人提到我的名字,进来看看,顺便蹭分^_^

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

    100分是全给你呢?还是给LQknife分20?

    对,应该改改:进来看看,看到有人提到我的名字,顺便蹭分^_^

    分是你的,你自己决定,这个贴我没出任何力,按理说不应该得分的,见者有份好了~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • CsToD
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:52:5413楼 得分:0
    引用 10 楼 yagebu1983 的回复:
    小心把你的号给封了!!

    我咋了?

    见者有份好了~~
    好,见者有份
    结贴!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved