通过反射调用带有可选参数的方法

Alx*_*ndr 55 .net c# reflection invoke default-value

我使用带有可选参数的C#4.0遇到了另一个问题.

我如何调用一个函数(或者更确切地说是构造函数,我有ConstructorInfo对象),我知道它不需要任何参数?

这是我现在使用的代码:

type.GetParameterlessConstructor()
    .Invoke(BindingFlags.OptionalParamBinding | 
            BindingFlags.InvokeMethod | 
            BindingFlags.CreateInstance, 
            null, 
            new object[0], 
            CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

(我刚试过不同的BindingFlags).

GetParameterlessConstructor是我写的自定义扩展方法Type.

Mat*_*low 124

根据MSDN,要使用默认参数,您应该通过Type.Missing.

如果您的构造函数有三个可选参数,那么您将传递一个三元素对象数组,而不是传递一个空对象数组,其中每个元素的值都是Type.Missing,例如

type.GetParameterlessConstructor()
    .Invoke(BindingFlags.OptionalParamBinding | 
            BindingFlags.InvokeMethod | 
            BindingFlags.CreateInstance, 
            null, 
            new object[] { Type.Missing, Type.Missing, Type.Missing }, 
            CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案实际上比标记为正确答案更好! (3认同)
  • @Alxandr 至少在`MethodInfo` 的情况下有一个稍微不方便的重载:`yourMethod.Invoke(target, Enumerable.Repeat(Type.Missing, 3).ToArray())`,其中`target` 可能是`null ` 在构造函数的情况下 (2认同)

SLa*_*aks 23

可选参数由普通属性表示,并由编译器处理.
它们对IL没有影响(元数据标志除外),反射不直接支持(除了IsOptionalDefaultValue属性).

如果要使用带反射的可选参数,则需要手动传递其默认值.