1. 程式人生 > >呼叫一個按鈕的Click事件(利用反射)。

呼叫一個按鈕的Click事件(利用反射)。

做了幾次。每次都忘記。所以記錄下來。

測試環境如下:

  • Windows 7
  • Visual Studio 2010
//建立一個函式
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;