public static MethodCallExpression Call(Expression instance, MethodInfo method, IEnumerable<Expression> arguments)
{
IReadOnlyList<Expression> argumentList = arguments as IReadOnlyList<Expression>;
if (argumentList != null)
{
int argCount = argumentList.Count;
switch (argCount)
{
case 0:
return Call(instance, method);
case 1:
return Call(instance, method, argumentList[0]);
case 2:
return Call(instance, method, argumentList[0], argumentList[1]);
case 3:
return Call(instance, method, argumentList[0], argumentList[1], argumentList[2]);
}
if (instance == null)
{
switch (argCount)
{
case 4:
return Call(method, argumentList[0], argumentList[1], argumentList[2], argumentList[3]);
case 5:
return Call(method, argumentList[0], argumentList[1], argumentList[2], argumentList[3], argumentList[4]);
}
}
}
ContractUtils.RequiresNotNull(method, nameof(method));
ReadOnlyCollection<Expression> argList = arguments.ToReadOnly();
ValidateMethodInfo(method, nameof(method));
ValidateStaticOrInstanceMethod(instance, method);
ValidateArgumentTypes(method, ExpressionType.Call, ref argList, nameof(method));
if (instance == null)
{
return new MethodCallExpressionN(method, argList);
}
else
{
return new InstanceMethodCallExpressionN(method, instance, argList);
}
}