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方法。这可能需要使用反射,因为这些方法通常是受保护的,而不是公共的
InvalidOperationException
异常
- 对于WinForms:如果您确定代码只能通过同一应用程序中其他UI元素的事件处理程序调用,那么就不必担心线程。否则,您必须将可能操纵UI状态的所有内容(例如对
)的调用)包装在一个单独的方法中,并与该方法一起使用。它通常最容易与lambda表达式一起使用,例如PerformClick()
formContainingButton.Invoke(()=>button.PerformClick())代码>
(其他框架可能具有处理UI线程的类似构造。)什么是
此类型
?另外,请为按钮添加签名\u单击这似乎是一个XY问题。通过调用按钮\u单击,您试图实现什么?您应该将按钮的实现移动到公共
方法。还有,让按钮\u单击和您计划使用方法信息的位置。调用来调用实现方法。此类型是该方法所在的表单类型。不幸的是,我不能将实际按钮的方法作为公共方法,因此我要这样做。
MethodInfo theMethod = thisType
.GetMethod("buttonClick", BindingFlags.NonPublic | BindingFlags.Instance);