调用一个按钮的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;



 

你可能感兴趣的:(C#)