2012-06-20 84 views
4

我使用的是公共靜態類和靜態方法與它的參數:使用反射來獲取靜態方法將其參數

public static class WLR3Logon 
{ 
    static void getLogon(int accountTypeID) 
    {} 
} 

現在我試圖與它的參數的方法提取到另一個類,並使用下面的代碼:

MethodInfo inf = typeof(WLR3Logon).GetMethod("getLogon", 
    BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy); 

int[] parameters = { accountTypeId }; 

foreach (int parameter in parameters) 
{ 
    inf.Invoke("getLogon", parameters); 
} 

但它給我的錯誤

「對象引用不設置到對象的實例「。

我要去哪裏錯了。

回答

8

這個問題得到了通過以下方法解決:

using System.Reflection;  
string methodName = "getLogon"; 
Type type = typeof(WLR3Logon); 
MethodInfo info = type.GetMethod(
    methodName, 
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy); 

object value = info.Invoke(null, new object[] { accountTypeId }); 
+0

如果我有***內部靜態類***? – Kiquenet

2

由於您尚未顯式聲明訪問修飾符,因此您的方法是私有的。您有兩種選擇讓您的代碼按預期工作:

  • 將您的方法更改爲public
  • GetMethod通話
0

指定BindingFlags.NonPublic讓你的方法public。之後

public static class WLR3Logon 
{ 
     public static void getLogon(int accountTypeID) 
     {} 
} 
4

有很多問題在這裏

  • 你的靜態方法是私人但你只能選擇在過濾的方法公開可見訪問它應該工作。要麼公開你的方法,要麼確保綁定標誌包含私有方法。現在,沒有方法會被發現返回inf爲空,這將導致你的null-ref異常。
  • 參數是一個int數組,其中MethodInfo需要一個對象數組。您需要確保您傳入一組對象。
  • 您只循環參數,以便用整個參數集多次調用該方法。去除循環。
  • 您可以調用MethodInfo.Invoke方法的名稱作爲第一個參數,因爲此方法是實例方法時此實例將用於實例。在你的情況,這種說法會被忽略