我需要通过默认值参数调用方法。它有TargetParameterCountException
消息:
Parameter count mismatch
var methodName = "MyMethod";
var params = new[] { "Param 1"};
var method = typeof(MyService).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(method.IsStatic ? null : this, params);
private void MyMethod(string param1, string param2 = null)
{
}
为什么呢? 如何通过反射调用参数的默认值来调用此方法?
答案 0 :(得分:9)
您可以使用ParameterInfo.HasDefaultValue
和ParameterInfo.DefaultValue
来检测此问题。您需要检查您给出的参数数量是否等于方法中的参数数量,然后找到具有默认值的参数并提取这些默认值。
例如:
var parameters = method.GetParameters();
object[] args = new object[parameters.Length];
for (int i = 0; i < args.Length; i++)
{
if (i < providedArgs.Length)
{
args[i] = providedArgs[i];
}
else if (parameters[i].HasDefaultValue)
{
args[i] = parameters[i].DefaultValue;
}
else
{
throw new ArgumentException("Not enough arguments provided");
}
}
method.Invoke(method.IsStatic ? null : this, args);