做了幾次。每次都忘記。所以記錄下來。
測試環境如下:
- 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;