因为业务特殊需要,根据事件类型名称,进行反射,动态的绑定事件,现已经实现。/// <summary>
/// 自定义事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CustomHandler(Object sender, EventArgs e)
{
     因为一个控件有个可能绑定了多个事件,在事件内部,需要根据不同的事件类型进行区分。
      如 是Click事件我处理A逻辑,是KeyUp事件我处理B逻辑     
}我的问题是如何获取当前触发的事件类型,EventArgs中没找到相关信息。求助各位大神 求助 事件 反射

解决方案 »

  1.   

    我通过 EventName 成功创建了 委托和事件 并在事件触发时进行了调用现在就想在事件触发时 获取当前EventName
      

  2.   

    或者有没有办法在 Invoke的时候传入自定义的参数
      

  3.   

    厄· 楼上很严肃·怎么说呢 那是不是我要按照传统规则一个个判断
    判断是Click 然后就定义一个Click事件 里面处理Click的处理逻辑这样你认为才对?老大 反射的特效是干嘛 就是动态加载啊 在运行时才知道 我要生成什么事件 进行什么样的处理而不是一开始就全部代码写死了
      

  4.   

    Click += onchick;
    KeyUp += onkeyup;

    Click += onevent;
    KeyUp += onevent;void onevent()
    {
      if(Click)
      {
          //onchick 
      }
    else if(KeyUp)
      {
         //onkeyup
      }
    }如果你非觉得下面这种方式比上面那种方式显得优越,那我只能说你太嫩了。
    其实在逻辑上,上下两种方式是一样的,一般来说,采用上面的方式代码好维护一点,而且符合正常的思维逻辑。不过这都不重要,你的问题在于把反射神话了,反射顶多是动态加载而已。而你的逻辑代码始终是静态了,也就是说,如果哪天我加了一个事件myevent,那么你就还要多一个if(myevent);//domyevent,真没看出来优越性在哪。说难听点,你现在搞的东西是无数人玩剩下来的东西,刚入门,或者即将入门的人总觉得可以做一种万能处理方法出来解决一切问题,这就跟500年前无数科学家都喜欢研究永动机一样,现在看来,在不推翻能量守恒定律的前提下研究永动机就是脑残。
      

  5.   

    如果你想通过统一的接口获取所有的事件的话,那么我想只有通过MESSAGE消息去获取,但是可能获取不到你所要的名字,只能是数字
      

  6.   

    楼主应该这样做,而不是CustomHandler
      

  7.   

    找到一点头绪了 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个?号的地方不知道应该传入什么参数
      

  8.   

    现在2个发展方向1. addHandler.Invoke(iElement, addHandlerArgs); 如何实现传递自定义参数2.DynamicMethod handler = new DynamicMethod("", null, ts); 能不能为实例方法,目前静态方法没问题我真不想越走越偏,在解决不了 我估计我就想研究怎么在当前业务中 静态访问动态方法了 那就太凄惨了
      

  9.   

    http://technet.microsoft.com/zh-cn/magazine/ms228976(VS.100).aspx分享下 《如何:使用反射将委托挂钩》
      

  10.   

    你给的资料,对于解决你的这后半个问题没有半点帮助。
    4#就已经告诉你解决方向了,比如你可以建立一个类
            public class CustomEvent
            {
                public event EventHandler OnEvent;
                public void CustomHandler(Object sender, EventArgs e)
                {
                    OnEvent(sender, e);
                }
            }
    每个不同的事件类型绑定到一个新的CustomEvent实例上
      

  11.   

    额,楼上的代码我有点没大看懂我的情况是 在未执行前我根本不知道有多少控件会进行调用 更不知道每种控件会需要绑定那些事件就像Visual Studio一样我英文极差 对C#源代码深恶痛绝所有来论坛求大神指点另 我给的资料就是如何实现动态绑定委托 动态生成方法我觉得对我帮助很大呀 现在功能基本都已经实现了 就差最后一点点 我真心不想采用折中方法(一个控件只支持一个事件,业务逻辑在其他部分进行补充)比如我有个CheckBox控件  如果只能绑定1个事件的话 我就没有办法在用户选中和取消选中的时候分别对应不同的逻辑当然 如果各位有更好的解决方案 我会很虚心学习前提是满足我的业务需要,在代码中 不会出现 指定的事件类型 只能出现“Click” 或 "Checked" "Unchecked" 这样的事件名 能够动态的根据这些名称反射出来跪求SP1234 各位版主 
      

  12.   

    没办法了,不想继续耽误时间 找了个蠢办法解决【第三方的控件 在事件内部都能获取到当前是被什么事件类型触发的,就系统自带的控件没有 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" });
                }
            }