如何使用反射调用带有可选参数的方法c#



我正在使用反射调用一个方法。然而,由于某些要求,方法参数中的一个被改变,并且保持新的参数作为可选参数。这是代码

Void Method1(string request, string constants, string count = null)
Void Method2(string request, string constants)

在Method1中,count参数是可选的这是代码:

result = methodInfo.Invoke(classInstance, new object[] {request, constants});

我尝试了以下方法,但得到了异常

result = methodInfo.Invoke(classInstance, new object[] {request, constants ,System.Type.Missing});

下面是方法2的异常,上面的代码适用于Method1

参数计数不匹配。

请建议我使用反射的方法中的可选参数

提前感谢!

可选参数:实际上并不是可选的——所发生的只是编译器通常会自动为您提供省略的值。由于您不是在中使用编译器,因此您需要使用new object[] {request, constants, null}自己提供它。请注意,如果您想正确地尊重默认值(而不是在这种情况下知道它是null(,您需要查看ParameterInfo,特别是.HasDefaultValue.DefaultValue

示例(不使用ParameterInfo,注意(:

using System;
using System.Reflection;
class P
{
static void Main()
{
string request = "r", constants = "c", count = "#";
var classInstance = new P();
typeof(P).GetMethod(nameof(Method1),
BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(classInstance, new object[] { request, constants, null });
typeof(P).GetMethod(nameof(Method1),
BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(classInstance, new object[] { request, constants, count });
typeof(P).GetMethod(nameof(Method2),
BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(classInstance, new object[] { request, constants });
}
void Method1(string request, string constants, string count = null)
=> Console.WriteLine($"#1: {request}, {constants}, {count}");
void Method2(string request, string constants)
=> Console.WriteLine($"#2: {request}, {constants}");
}

最新更新