C# 調用一個窗口的click事件(利用反射)

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

 

最基本的調用方法

(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;  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章