C# 在按钮单击函数上使用GetMethod和Invoke

C# 在按钮单击函数上使用GetMethod和Invoke,c#,invoke,buttonclick,C#,Invoke,Buttonclick,我有以下代码: object[] parameters = { new object(), new EventArgs() }; Type[] type = new[] { typeof(object), typeof(EventArgs)}; MethodInfo theMethod = thisType.GetMethod("button_Click", type); object result = theMethod.Invoke(this, param

我有以下代码:

    object[] parameters = { new object(), new EventArgs() };
    Type[] type = new[] { typeof(object), typeof(EventArgs)};
    MethodInfo  theMethod = thisType.GetMethod("button_Click", type);

    object result = theMethod.Invoke(this, parameterList);
当我进入theMethod.Invoke部分时,theMethod为null。我不明白为什么GetMethod找不到这个函数。它在同一个局部类中。这适用于我的所有其他功能

我不能在单击按钮时使用invoke,或者参数类型在某种程度上是特殊的吗?还有其他方法可以通过点击按钮来实现吗

编辑:

该按钮的功能是:

private void buttonClick(object sender, EventArgs e) ...

您的反射方法不起作用的原因是它只返回公共方法,而您的
按钮click
方法是私有的

若要使用反射访问非公共方法,必须使用一个重载,该重载接受
BindingFlags
,并包含
BindingFlags.NonPublic
以及
BindingFlags.Instance
和/或
BindingFlags.Static
,具体取决于您希望在搜索中包含的内容

通常,尤其是在处理事件处理程序时,只有同名的方法。在这种情况下,调用GetMethod时不需要指定参数类型。相反,您可以使用更简单的:

模拟按钮单击的更好方法 为了找到解决问题的最佳方法,请问自己以下问题:

首先:您真的需要使用反射吗?如果您可以控制与之交互的表单的源代码,即可以在表单类中添加内容,那么您应该跳过反射内容,并添加一个用于与按钮交互的公共方法

Second:您只是想调用一个特定的方法(“buttonClick”,它恰好也是一个事件处理程序),还是想正确地模拟一个用户操作,以便UI框架意识到“单击”并对其进行处理(调用所有附加的事件处理程序,不管方法名称如何,等等)

如何最好地模拟用户操作取决于您与之交互的框架:

  • 如果框架对此有一个特定的方法,那么调用该方法(如果必须的话,可以通过反射)。WinForms按钮具有该方法

  • 没有单独方法的框架,如WebForms,通常有一个可以调用的OnClicked方法。这可能需要使用反射,因为这些方法通常是受保护的,而不是公共的

Third:如果您使用的是Windows GUI框架(而不是web框架),您可能还需要确保从代码启动的UI操作在正确的线程上执行,否则可能会出现意外的
InvalidOperationException
异常

  • 对于WinForms:如果您确定代码只能通过同一应用程序中其他UI元素的事件处理程序调用,那么就不必担心线程。否则,您必须将可能操纵UI状态的所有内容(例如对
    PerformClick()
    )的调用)包装在一个单独的方法中,并与该方法一起使用。它通常最容易与lambda表达式一起使用,例如
    formContainingButton.Invoke(()=>button.PerformClick())

(其他框架可能具有处理UI线程的类似构造。)

什么是
此类型
?另外,请为
按钮添加签名\u单击
这似乎是一个XY问题。通过调用
按钮\u单击
,您试图实现什么?您应该将
按钮的实现移动到
公共
方法。还有,让
按钮\u单击
和您计划使用
方法信息的位置。调用
来调用实现方法。此类型是该方法所在的表单类型。不幸的是,我不能将实际按钮的方法作为公共方法,因此我要这样做。
MethodInfo theMethod = thisType
    .GetMethod("buttonClick", BindingFlags.NonPublic | BindingFlags.Instance);