• 调用一个按钮的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

  • 相关阅读:
    线程中断总结
    线程的基本协作和生产者消费者
    synchronized总结
    线程基础总结
    Java集合总结(三):堆与优先级队列
    Java集合总结(二):Map和Set
    Java集合总结(一):列表和队列
    java枚举类型总结
    java 内部类简单总结
    java Integer包装类装箱的一个细节
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2663180.html
Copyright © 2020-2023  润新知