2011-04-18 91 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); 
相關問題