2

来自反射新手的问题。我在 Windows 窗体中有一个方法:

private void handleOrderCode()
{
  //...do stuff
}

我试图以下列方式调用它:

Type t = this.GetType();
MethodInfo mi = t.GetMethod("handleOrderCode");
if (mi != null) mi.Invoke(this, null);

我已经确认“this”不为空。当这工作时,字符串“handleOrderCode”被硬编码的空间将被替换为字符串变量。但是,目前“mi”在最后一行的 if 语句中求值时始终为空。

那么我做错了什么?

4

3 回答 3

10

您需要指定绑定标志:

using System.Reflection;

t.GetMethod("handleOrderCode", BindingFlags.Instance | BindingFlags.NonPublic)

因为没有任何标志的重载意味着:

BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance

即不会返回任何非公共(私有、受保护等)成员。

于 2011-04-18T11:17:52.953 回答
5

的无参数重载Type.GetMethod仅查找公共方法:

搜索具有指定名称的公共方法。

您需要为另一个重载指定适当的BindingFlags值:

MethodInfo method = t.GetMethod("handleOrderCode",
                                BindingFlags.Instance | BindingFlags.NonPublic);

请注意,您需要在此处(或两者)指定“实例”或“静态”,而不仅仅是“非公开”。如果你也想寻找公共方法,你也必须包括它。

另一种选择就是让你的方法公开:)

(此外,我建议将其重命名HandleOrderCode为更传统、更惯用的 C#。)

于 2011-04-18T11:18:11.880 回答
4

尝试:

Type t = this.GetType();
MethodInfo mi = t.GetMethod("handleOrderCode", 
   BindingFlags.NonPublic | BindingFlags.Instance);
if (mi != null) mi.Invoke(this, null);
于 2011-04-18T11:18:56.747 回答