//CONFORMING
public static InvocationExpression Invoke(Expression expression, IEnumerable <Expression> arguments)
{
RequiresCanRead(expression, "expression");
Type delegateType = expression.Type;
if (delegateType == typeof(Delegate))
{
throw Error.ExpressionTypeNotInvocable(delegateType);
}
else if (!typeof(Delegate).IsAssignableFrom(expression.Type))
{
Type exprType = TypeUtils.FindGenericType(typeof(Expression <>), expression.Type);
if (exprType == null)
{
throw Error.ExpressionTypeNotInvocable(expression.Type);
}
delegateType = exprType.GetGenericArguments()[0];
}
var mi = delegateType.GetMethod("Invoke");
var args = arguments.ToReadOnly();
ValidateArgumentTypes(mi, ExpressionType.Invoke, ref args);
return(new InvocationExpression(expression, args, mi.ReturnType));
}