2011-04-18 38 views
2

来自反射新手的问题。我有一个Windows窗体的方法:为什么我不能通过字符串调用这个方法?

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

我正努力通过以下方式来调用:

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

我已经证实,“这个”不为空。字符串“handleOrderCode”已被硬编码的空间在工作时将被替换为字符串变量。但是,目前“mi”在最后一行的if语句中评估时总是为空。

那么我做错了什么?

+1

“this”永远不会为空:) – 2011-04-18 11:21:59

+0

@NimsDotNet:除非您在IL中非虚拟地调用实例方法。它可以做:) – 2011-04-18 11:22:51

+0

是啊,我之前的一个谷歌搜索之前询问强调,有些情况下,奇怪的是,它可以,所以我想我会仔细检查。皮带和大括号等等。 – 2011-04-18 11:37:41

回答

10

你需要指定绑定标志:

using System.Reflection; 

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

因为没有任何标志的过载是指:

BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance 

即不会返回任何非公(民营,保护等)成员。

+0

你会认为我对谷歌搜索的许多内容之一可能会提及......但不是。谢谢。 – 2011-04-18 11:38:44

5

parameterless overload of Type.GetMethod只查找公共方法:

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

您需要指定一个合适的BindingFlags价值another overload代替:

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

请注意,你需要指定“实例”或“静态”在这里(或两者),不只是“非公开”。如果你想要寻找公共方法,你也必须包含这些方法。

另一种选择是只是为了让你的方法公开:)

4

试(另外,我建议它重命名为HandleOrderCode更传统,地道的C#):

Type t = this.GetType(); 
MethodInfo mi = t.GetMethod("handleOrderCode", 
    BindingFlags.NonPublic | BindingFlags.Instance); 
if (mi != null) mi.Invoke(this, null); 
相关问题