Exemple #1
0
        public static Expression BuildConversionCall(this IExpressionGenerator gen, MethodInfo method, Expression input, Type resultType) {
            Contract.Requires(gen != null);
            Contract.Requires(method != null);
            Contract.Requires(input != null);

            var methodParams = method.GetParameters();
            if (methodParams.Length > 0) {
                Contract.Assume(methodParams[0] != null);
                var paramType = methodParams[0].ParameterType;
                if (input.Type != paramType) {
                    input = gen.GenerateConversionOrThrow(paramType, input);
                }
            }

            Expression result = method.BuildCallExpression(input);
            if (resultType != null && result.Type != resultType) {
                result = gen.GenerateConversionOrThrow(resultType, result);
            }

            return result;
        }
Exemple #2
0
        public static Expression BuildConversionCall(this IExpressionGenerator gen, MethodInfo method, Type resultType, params Expression[] inputExpressions) {
            Contract.Requires(gen != null);
            Contract.Requires(method != null);
            Contract.Requires(inputExpressions != null);
            Contract.Requires(Contract.ForAll(inputExpressions, x => x != null));

            var methodParams = method.GetParameters();
            if(methodParams.Length != inputExpressions.Length)
                throw new ArgumentException(String.Format("{0} input expressions are required.", methodParams.Length));

            for (int i = 0; i < methodParams.Length; i++) {
                Contract.Assume(methodParams[i] != null);
                var paramType = methodParams[i].ParameterType;
                var inputExpression = inputExpressions[i];
                if (inputExpression.Type != paramType) {
                    inputExpressions[i] = gen.GenerateConversionOrThrow(paramType, inputExpression);
                }
            }

            Expression result = method.BuildCallExpression(inputExpressions);
            if (resultType != null && result.Type != resultType)
                result = gen.GenerateConversionOrThrow(resultType, result);

            return result;
        }