呼叫一個按鈕的Click事件(利用反射)。
阿新 • • 發佈:2019-02-17
做了幾次。每次都忘記。所以記錄下來。
測試環境如下:
- 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;