调用一个按钮的Click事件(利用反射)。

时间:2021-11-10 00:56:38

做了几次。每次都忘记。所以记录下来。

测试环境如下:

  • 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;