2011-10-19 52 views
9

我有一個具有可選參數的私有靜態方法的類。我如何通過反射從另一個類中調用它?有一個類似的question,但它不涉及靜態方法或可選參數。如何使用可選參數通過反射執行私有靜態方法?

public class Foo { 
    private static void Bar(string key = "") { 
     // do stuff 
    } 
} 

如何調用Foo.Bar("test")Foo.Bar()(例如,而沒有經過可選參數)?

回答

20

C#中的可選參數值通過在調用點注入這些值進行編譯。即即使你的代碼是

Foo.Bar() 

編譯器實際上產生像

Foo.Bar("") 

打電話找到你需要把可選參數作爲常規參數的方法時。

var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic); 

如果你知道你要調用的方法與你能做什麼值:

method.Invoke(obj: null, parameters: new object[] { "Test" }); 

如果你只有一些參數,並希望遵守默認的值你必須檢查方法的ParameterInfo對象以查看參數是否可選以及這些值是什麼。例如,要打印出這些參數的默認值,你可以使用下面的代碼:

foreach (ParameterInfo pi in method.GetParameters()) 
{ 
    if (pi.IsOptional) 
    { 
     Console.WriteLine(pi.Name + ": " + pi.DefaultValue); 
    } 
} 
+0

什麼靜態方法部分之前? – AngryHacker

+0

@AngryHacker使用'BindingFlags.Static'(查看更新後的答案) – marcind

2

使用這個類

public class Foo 
    { 
    private static void Bar(string key = "undefined key", string value = "undefined value") 
    { 
     Console.WriteLine(string.Format("The key is '{0}'", key)); 
     Console.WriteLine(string.Format("The value is '{0}'", value)); 
    } 
    } 

您可以使用下面的代碼使用默認值來調用它

MethodInfo mi = typeof(Foo).GetMethod("Bar", BindingFlags.NonPublic | BindingFlags.Static); 
    ParameterInfo[] pis = mi.GetParameters(); 

    object[] parameters = new object[pis.Length]; 

    for (int i = 0; i < pis.Length; i++) 
    { 
    if (pis[i].IsOptional) 
    { 
     parameters[i] = pis[i].DefaultValue; 
    } 
    } 

    mi.Invoke(null, parameters); 

如果該方法有一些非可選參數,則必須在調用方法之前將它們插入參數數組中。

E.g

private static void Bar(int number, string key = "undefined key", string value = "undefined") 

會要求你做

parameters[0] = "23" 

調用

相關問題