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

原文地址:https://www.cnblogs.com/zhangchenliang/p/2663180.html