紧急求助,关于事件 反射问题

ls0526 2013-05-07 04:26:22
因为业务特殊需要,根据事件类型名称,进行反射,动态的绑定事件,现已经实现。

/// <summary>
/// 自定义事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CustomHandler(Object sender, EventArgs e)
{
因为一个控件有个可能绑定了多个事件,在事件内部,需要根据不同的事件类型进行区分。
如 是Click事件我处理A逻辑,是KeyUp事件我处理B逻辑
}

我的问题是如何获取当前触发的事件类型,EventArgs中没找到相关信息。

求助各位大神
...全文
297 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
ls0526 2013-05-09
  • 打赏
  • 举报
回复
没办法了,不想继续耽误时间 找了个蠢办法解决【第三方的控件 在事件内部都能获取到当前是被什么事件类型触发的,就系统自带的控件没有 TextBox Label CheckBox 只能这样给所有的自带控件事件都包装一次】 以下为控件代码 public class CustomEventArgs : RoutedEventArgs { public string EventName { get; set; } } public delegate void CheckedEventHandler(object sender, CustomEventArgs e); public delegate void IndeterminateEventHandler(object sender, CustomEventArgs e); public delegate void UncheckedEventHandler(object sender, CustomEventArgs e); /// <summary> /// Grad - 可选框控件 /// </summary> public class GradCheckBox : CheckBox, IGradFromControl { public event CheckedEventHandler Checked; public event IndeterminateEventHandler Indeterminate; public event UncheckedEventHandler Unchecked; bool oldValue = false; /// <summary> /// 构造函数 /// </summary> public GradCheckBox() : base() { /*默认样式*/ base.Checked += new RoutedEventHandler(GradCheckBox_Checked); base.Unchecked += new RoutedEventHandler(GradCheckBox_Unchecked); } void GradCheckBox_Unchecked(object sender, RoutedEventArgs e) { if (this.Unchecked != null) { Unchecked(sender, new CustomEventArgs() { EventName = "Unchecked" }); } } void GradCheckBox_Checked(object sender, RoutedEventArgs e) { if (this.Checked != null) { Unchecked(sender, new CustomEventArgs() { EventName = "Checked" }); } }
ls0526 2013-05-09
  • 打赏
  • 举报
回复
新的一天,继续真心求帮助
showjim 2013-05-08
  • 打赏
  • 举报
回复
引用 4 楼 gomoku 的回复:
你不知道是什么,如何能正确响应事件呢? 又比如你的要求:“在事件内部,需要根据不同的事件类型进行区分”。 既然要区分不同事件,并进行不用处理,为什么不一开始就把不同的事件绑定到不同的处理函数呢?
楼主应该这样做,而不是CustomHandler
ls0526 2013-05-08
  • 打赏
  • 举报
回复
额,楼上的代码我有点没大看懂 我的情况是 在未执行前我根本不知道有多少控件会进行调用 更不知道每种控件会需要绑定那些事件 就像Visual Studio一样 我英文极差 对C#源代码深恶痛绝 所有来论坛求大神指点 另 我给的资料就是如何实现动态绑定委托 动态生成方法 我觉得对我帮助很大呀 现在功能基本都已经实现了 就差最后一点点 我真心不想采用折中方法(一个控件只支持一个事件,业务逻辑在其他部分进行补充) 比如我有个CheckBox控件 如果只能绑定1个事件的话 我就没有办法在用户选中和取消选中的时候分别对应不同的逻辑 当然 如果各位有更好的解决方案 我会很虚心学习 前提是满足我的业务需要,在代码中 不会出现 指定的事件类型 只能出现“Click” 或 "Checked" "Unchecked" 这样的事件名 能够动态的根据这些名称反射出来 跪求SP1234 各位版主
showjim 2013-05-08
  • 打赏
  • 举报
回复
引用 28 楼 ls0526 的回复:
http://technet.microsoft.com/zh-cn/magazine/ms228976(VS.100).aspx 分享下 《如何:使用反射将委托挂钩》
你给的资料,对于解决你的这后半个问题没有半点帮助。 4#就已经告诉你解决方向了,比如你可以建立一个类
        public class CustomEvent
        {
            public event EventHandler OnEvent;
            public void CustomHandler(Object sender, EventArgs e)
            {
                OnEvent(sender, e);
            }
        }
每个不同的事件类型绑定到一个新的CustomEvent实例上
ls0526 2013-05-08
  • 打赏
  • 举报
回复
http://technet.microsoft.com/zh-cn/magazine/ms228976(VS.100).aspx 分享下 《如何:使用反射将委托挂钩》
ls0526 2013-05-08
  • 打赏
  • 举报
回复
现在2个发展方向 1. addHandler.Invoke(iElement, addHandlerArgs); 如何实现传递自定义参数 2.DynamicMethod handler = new DynamicMethod("", null, ts); 能不能为实例方法,目前静态方法没问题 我真不想越走越偏,在解决不了 我估计我就想研究怎么在当前业务中 静态访问动态方法了 那就太凄惨了
ls0526 2013-05-08
  • 打赏
  • 举报
回复
我也不想这样 我只是很简单那的 想动态的给控件绑定事件 在事件内部能过知道 当前是什么事件所触发的 枚举所有控件 所有事件 对目前的需求来说 不现实 我不是要减少代码量 也不是要耦合不耦合 我就是单纯的要实现这个功能
gx831218 2013-05-08
  • 打赏
  • 举报
回复
感觉楼主在技术上有点钻牛角尖了,应该先看看是否只有这种方式才能达到你的目的,且不说性能,这样的代码耦合性不一定就松,因为楼主选的技术实现方式就比较狭窄且逻辑性不是太好(否则不会这么多人都说逻辑上有一定的问题),容不了大的变动。 想减少代码量且容易扩展的方式有很多:泛型、接口、配置文件 等等等等,反射只是其中的一种。 个人感觉楼主应该重新思考一下。
ls0526 2013-05-08
  • 打赏
  • 举报
回复
求版主指点·
ls0526 2013-05-08
  • 打赏
  • 举报
回复
找到一点头绪了 Emit 动态生成方法 应该能解决次问题 经过测试发现 目前仍存在2个问题 1.网上的例子 都是以调用静态方法,如何调研实例方法,正在研究中。 2.网上的例子 参数都是值类型,如何传对象,正在研究中。 跪求大神指点 以下方法可以调用 MethodInfo simpleShow = typeof(InputFrom).GetMethod("Demo", showParameters); 以下方法调用异常 MethodInfo simpleShow1 = typeof(InputFrom).GetMethod("Demo1", BindingFlags.NonPublic | BindingFlags.Instance); MethodInfo simpleShow2 = typeof(GradInputFrom).GetMethod("Demo2", BindingFlags.NonPublic | BindingFlags.Instance, ?, showParameters, ?); 菜鸟程序员一个 GetMethod方法用得很少 2个?号的地方不知道应该传入什么参数
ls0526 2013-05-07
  • 打赏
  • 举报
回复
晚饭后继续求
ls0526 2013-05-07
  • 打赏
  • 举报
回复
到家了 再顶 真心求
ls0526 2013-05-07
  • 打赏
  • 举报
回复
谢谢楼上的回答 我也在考虑编号的问题 晚上回家再研究研究 至于另外一位朋友 很感谢你回复了这么多 只是你可能没大明白我的场景 我很少发帖问问题 你愿意回复我就很高兴了 可能口才差 描述有问题 让你误会了 简单来说 就像通过统一标准接口 根据类名反射出对象 在对象实例化后 我是能得到当前类名的 同理根据事件名反射 动态绑定方法后 在该方法里也是应该能得到当前事件名的 这样说是否合理些了
wxl1010 2013-05-07
  • 打赏
  • 举报
回复
如果你想通过统一的接口获取所有的事件的话,那么我想只有通过MESSAGE消息去获取,但是可能获取不到你所要的名字,只能是数字
cheng2005 2013-05-07
  • 打赏
  • 举报
回复
Click += onchick; KeyUp += onkeyup; 与 Click += onevent; KeyUp += onevent; void onevent() { if(Click) { //onchick } else if(KeyUp) { //onkeyup } } 如果你非觉得下面这种方式比上面那种方式显得优越,那我只能说你太嫩了。 其实在逻辑上,上下两种方式是一样的,一般来说,采用上面的方式代码好维护一点,而且符合正常的思维逻辑。 不过这都不重要,你的问题在于把反射神话了,反射顶多是动态加载而已。而你的逻辑代码始终是静态了,也就是说,如果哪天我加了一个事件myevent,那么你就还要多一个if(myevent);//domyevent,真没看出来优越性在哪。 说难听点,你现在搞的东西是无数人玩剩下来的东西,刚入门,或者即将入门的人总觉得可以做一种万能处理方法出来解决一切问题,这就跟500年前无数科学家都喜欢研究永动机一样,现在看来,在不推翻能量守恒定律的前提下研究永动机就是脑残。
ls0526 2013-05-07
  • 打赏
  • 举报
回复
再次顶·下班了 各位大哥 大神 大叔 帮帮忙哈
ls0526 2013-05-07
  • 打赏
  • 举报
回复
求大牛 求版主 不然我只能一个脚跳了 说我的产品是阉割版 一个控件只支持定义一个事件
ls0526 2013-05-07
  • 打赏
  • 举报
回复
厄· 楼上很严肃· 怎么说呢 那是不是我要按照传统规则一个个判断 判断是Click 然后就定义一个Click事件 里面处理Click的处理逻辑 这样你认为才对? 老大 反射的特效是干嘛 就是动态加载啊 在运行时才知道 我要生成什么事件 进行什么样的处理 而不是一开始就全部代码写死了
cheng2005 2013-05-07
  • 打赏
  • 举报
回复
没救了,如果你好好读读我7#的话,就知道自己犯了什么错误。左脚踩右脚,右脚踩左脚,这样你就能不停的往高跳,你觉得是这样吗?
加载更多回复(12)

110,538

社区成员

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

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

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