我有一個具有可選參數的私有靜態方法的類。我如何通過反射從另一個類中調用它?有一個類似的question,但它不涉及靜態方法或可選參數。如何使用可選參數通過反射執行私有靜態方法?
public class Foo {
private static void Bar(string key = "") {
// do stuff
}
}
如何調用Foo.Bar("test")
和Foo.Bar()
(例如,而沒有經過可選參數)?
我有一個具有可選參數的私有靜態方法的類。我如何通過反射從另一個類中調用它?有一個類似的question,但它不涉及靜態方法或可選參數。如何使用可選參數通過反射執行私有靜態方法?
public class Foo {
private static void Bar(string key = "") {
// do stuff
}
}
如何調用Foo.Bar("test")
和Foo.Bar()
(例如,而沒有經過可選參數)?
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);
}
}
使用這個類
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"
調用
什麼靜態方法部分之前? – AngryHacker
@AngryHacker使用'BindingFlags.Static'(查看更新後的答案) – marcind