做了几次。每次都忘记。所以记录下来。
测试环境如下:
- 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;