Ang*_*ker 10 c# reflection .net-4.0 optional-parameters c#-4.0
我有一个带有私有静态方法的类,带有可选参数.如何通过Reflection从另一个类调用它?有一个类似的问题,但它没有解决静态方法或可选参数.
public class Foo {
private static void Bar(string key = "") {
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我如何调用Foo.Bar("test")和Foo.Bar()(例如,不传递可选参数)?
mar*_*ind 23
C#中的可选参数值是通过在调用点注入这些值来编译的.即使你的代码是
Foo.Bar()
Run Code Online (Sandbox Code Playgroud)
编译器实际上生成一个调用
Foo.Bar("")
Run Code Online (Sandbox Code Playgroud)
找到方法时,需要将可选参数视为常规参数.
var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic);
Run Code Online (Sandbox Code Playgroud)
如果您确切知道要调用方法的值,则可以执行以下操作:
method.Invoke(obj: null, parameters: new object[] { "Test" });
Run Code Online (Sandbox Code Playgroud)
如果您只有一些参数并且想要遵守默认值的值,则必须检查方法的ParameterInfo对象以查看参数是否是可选的以及这些值是什么.例如,要打印出这些参数的默认值,您可以使用以下代码:
foreach (ParameterInfo pi in method.GetParameters())
{
if (pi.IsOptional)
{
Console.WriteLine(pi.Name + ": " + pi.DefaultValue);
}
}
Run Code Online (Sandbox Code Playgroud)