如何通过反射执行带有可选参数的私有静态方法?

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)