zoukankan      html  css  js  c++  java
  • 利用反射--调用一个按钮的Click事件

    最基本的调用方法

    (1)button1.PerformClick();
    (2)button1_Click(null,null);
    (3)button_Click(null,new EventArgs());

    利用反射调用

    最开始的调用方法

    复制代码
    //建立一个函数  
    private void callOnClick(Button btn)  
    {  
        //建立一个类型  
        Type t = typeof(Button);  
        //参数对象  
        object[] p = new object[1];  
        //产生方法  
        MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);  
        //参数赋值。传入函数  
        p[0] = EventArgs.Empty;  
        //调用  
        m.Invoke(btn, p);  
        return;  
    }  
      
    //调用例子。  
    //调用Button1的onclick  
    callOnClick(Button1);  
      
    //调用Button5的onclick  
    callOnClick(Button5);  
    复制代码

    扩展一下,可以调用更多的事件。

    复制代码
    private void callButtonEvent(Button btn, string EventName)  
    {     
        //建立一个类型      
        Type t = typeof(Button);  
        //参数对象      
        object[] p = new object[1];  
        //产生方法      
        MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
        //参数赋值。传入函数      
        //获得参数资料  
        ParameterInfo[] para =  m.GetParameters();  
        //根据参数的名字,拿参数的空值。  
        p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
        //调用      
        m.Invoke(btn, p);  
        return;  
    }  
      
    //调用例子。  
    //调用Button1的onclick  
    callButtonEvent(Button1,"OnClick");  
      
    //调用Button5的OnKeyPress  
    callButtonEvent(Button5,"OnKeyPress");  
    复制代码

    现在,再来一次扩展。可以处理Button,TextBox等等的一些事件。

    复制代码
    private void callObjectEvent(Object obj, string EventName)  
    {     
         //建立一个类型,AssemblyQualifiedName拿出有效的名字     
         Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
         //参数对象      
         object[] p = new object[1];  
         //产生方法      
         MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
         //参数赋值。传入函数      
         //获得参数资料  
         ParameterInfo[] para =  m.GetParameters();  
         //根据参数的名字,拿参数的空值。  
         p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
         //调用      
         m.Invoke(obj, p);  
         return;  
    }  
      
    //调用例子。  
    //调用Button1的onclick  
    callObjectEvent(Button1,"OnClick");  
      
    //调用Button5的OnKeyPress  
    callObjectEvent(Button5,"OnKeyPress");  
      
    //调用Text1的OnTextChanged  
    callObjectEvent(Text1, "OnTextChanged");  
    复制代码

    继续来多一个扩展。可以传入事件参数。

    复制代码
    private void callObjectEvent(Object obj, string EventName, EventArgs e=null)  
    {     
        //建立一个类型      
        //Type t = typeof(obj.GetType);  
        Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
        //产生方法      
        MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
        //参数赋值。传入函数      
        //获得参数资料  
        ParameterInfo[] para =  m.GetParameters();  
        //根据参数的名字,拿参数的空值。  
        //参数对象      
        object[] p = new object[1];  
        if (e == null)  
            p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
        else  
            p[0] = e;  
        //调用  
        m.Invoke(obj, p);  
        return;  
    }  
      
    //调用例子。  
    //调用Button1的onclick  
    callObjectEvent(Button1,"OnClick");  
    //调用Button5的OnKeyPress  
    callObjectEvent(Button5,"OnKeyPress");  
    //调用Text1的OnTextChanged  
    callObjectEvent(Text1, "OnTextChanged");  
    //调用Form的KeyPress事件, this就是那个winform, 并且传入回车键  
    callObjectEvent(this, "OnKeyPress", new KeyPressEventArgs((char)13));  
    复制代码

    测试的时候,是在winform里的控件的调用。在程序里要加入

    using System.Reflection;  

    引用自 :http://blog.csdn.net/dogfish/article/details/7048280

    出处:https://www.cnblogs.com/feiyuhuo/p/5407544.html

  • 相关阅读:
    android笔记5——同一个Activity中Fragment的切换
    JavaScript 刚開始学习的人应知的 24 条最佳实践
    位运算符之异或的化腐朽为奇妙
    unity常见问题之20题
    汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码
    基于canvas和Web Audio的音频播放器
    poj2595(凸包)
    HDU 1257 最少拦截系统(dp)
    【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容
    万能狗! 程序猿屌丝独自创业之路(一)
  • 原文地址:https://www.cnblogs.com/mq0036/p/10406766.html
Copyright © 2011-2022 走看看