如何通过反射按参数的默认值调用方法

时间:2013-12-24 11:11:27

标签: c# reflection

我需要通过默认值参数调用方法。它有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)
{
}

为什么呢? 如何通过反射调用参数的默认值来调用此方法?

1 个答案:

答案 0 :(得分:9)

您可以使用ParameterInfo.HasDefaultValueParameterInfo.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);