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

    做了几次。每次都忘记。所以记录下来。

    测试环境如下:

    • Windows 7
    • Visual Studio 2010
    [csharp] view plaincopy
    1. //建立一个函数  
    2. private void callOnClick(Button btn)  
    3. {  
    4.     //建立一个类型  
    5.     Type t = typeof(Button);  
    6.     //参数对象  
    7.     object[] p = new object[1];  
    8.     //产生方法  
    9.     MethodInfo m = t.GetMethod("OnClick", BindingFlags.NonPublic | BindingFlags.Instance);  
    10.     //参数赋值。传入函数  
    11.     p[0] = EventArgs.Empty;  
    12.     //调用  
    13.     m.Invoke(btn, p);  
    14.     return;  
    15. }  
    16.   
    17. //调用例子。  
    18. //调用Button1的onclick  
    19. callOnClick(Button1);  
    20.   
    21. //调用Button5的onclick  
    22. callOnClick(Button5);  


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

    [csharp] view plaincopy
    1. private void callButtonEvent(Button btn, string EventName)  
    2. {     
    3.     //建立一个类型      
    4.     Type t = typeof(Button);  
    5.     //参数对象      
    6.     object[] p = new object[1];  
    7.     //产生方法      
    8.     MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
    9.     //参数赋值。传入函数      
    10.     //获得参数资料  
    11.     ParameterInfo[] para =  m.GetParameters();  
    12.     //根据参数的名字,拿参数的空值。  
    13.     p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
    14.     //调用      
    15.     m.Invoke(btn, p);  
    16.     return;  
    17. }  
    18.   
    19. //调用例子。  
    20. //调用Button1的onclick  
    21. callButtonEvent(Button1,"OnClick");  
    22.   
    23. //调用Button5的OnKeyPress  
    24. callButtonEvent(Button5,"OnKeyPress");  

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

    [csharp] view plaincopy
    1. private void callObjectEvent(Object obj, string EventName)  
    2. {     
    3.      //建立一个类型,AssemblyQualifiedName拿出有效的名字     
    4.      Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
    5.      //参数对象      
    6.      object[] p = new object[1];  
    7.      //产生方法      
    8.      MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
    9.      //参数赋值。传入函数      
    10.      //获得参数资料  
    11.      ParameterInfo[] para =  m.GetParameters();  
    12.      //根据参数的名字,拿参数的空值。  
    13.      p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
    14.      //调用      
    15.      m.Invoke(obj, p);  
    16.      return;  
    17. }  
    18.   
    19. //调用例子。  
    20. //调用Button1的onclick  
    21. callObjectEvent(Button1,"OnClick");  
    22.   
    23. //调用Button5的OnKeyPress  
    24. callObjectEvent(Button5,"OnKeyPress");  
    25.   
    26. //调用Text1的OnTextChanged  
    27. callObjectEvent(Text1, "OnTextChanged");  

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

    [csharp] view plaincopy
    1. private void callObjectEvent(Object obj, string EventName, EventArgs e=null)  
    2. {     
    3.     //建立一个类型      
    4.     //Type t = typeof(obj.GetType);  
    5.     Type t = Type.GetType(obj.GetType().AssemblyQualifiedName);  
    6.     //产生方法      
    7.     MethodInfo m = t.GetMethod(EventName, BindingFlags.NonPublic | BindingFlags.Instance);  
    8.     //参数赋值。传入函数      
    9.     //获得参数资料  
    10.     ParameterInfo[] para =  m.GetParameters();  
    11.     //根据参数的名字,拿参数的空值。  
    12.     //参数对象      
    13.     object[] p = new object[1];  
    14.     if (e == null)  
    15.         p[0] = Type.GetType(para[0].ParameterType.BaseType.FullName).GetProperty("Empty");  
    16.     else  
    17.         p[0] = e;  
    18.     //调用  
    19.     m.Invoke(obj, p);  
    20.     return;  
    21. }  
    22.   
    23. //调用例子。  
    24. //调用Button1的onclick  
    25. callObjectEvent(Button1,"OnClick");  
    26. //调用Button5的OnKeyPress  
    27. callObjectEvent(Button5,"OnKeyPress");  
    28. //调用Text1的OnTextChanged  
    29. callObjectEvent(Text1, "OnTextChanged");  
    30. //调用Form的KeyPress事件, this就是那个winform, 并且传入回车键  
    31. callObjectEvent(this"OnKeyPress"new KeyPressEventArgs((char)13));  


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

    [csharp] view plaincopy
      1. using System.Reflection;  

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

  • 相关阅读:
    雨林木风操作系统有感
    Bitcoin P2P 虚拟货币原理详解
    SVN switch 用法详解
    Bitcoin P2P 货币:有史以来最危险的项目
    回旋线科普
    Mathematica 如何绘制双纵坐标轴的图像?
    c#数据库操作
    在自定义HttpHandler中无法使用Session
    VS2010安装因net framework4.0无法安装而失败的解决方法
    .net framework 4.0 0xc8000247错误解决
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2663180.html
Copyright © 2011-2022 走看看