Ejemplo n.º 1
0
        private static Func <Closure, object> Unary(UnaryExpression unaryExpression,
                                                    ConstantExpression[] constantsExprs, ParameterExpression[] localsExprs)
        {
            var valueFn          = Expression(unaryExpression.Operand, constantsExprs, localsExprs);
            var opUnaryNegation  = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_UnaryNegation");
            var opUnaryPlus      = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_UnaryPlus");
            var opOnesComplement = WrapUnaryOperation(unaryExpression.Method) ?? WrapUnaryOperation(unaryExpression.Operand.Type, "op_OnesComplement");
            var isNullable       = IsNullable(unaryExpression.Operand);

            return(closure =>
            {
                var operand = valueFn(closure);

                if (isNullable && operand == null && unaryExpression.NodeType != ExpressionType.ArrayLength)
                {
                    return null;
                }

                switch (unaryExpression.NodeType)
                {
                case ExpressionType.Negate:
                case ExpressionType.NegateChecked:
                    return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opUnaryNegation);

                case ExpressionType.UnaryPlus:
                    return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opUnaryPlus);

                case ExpressionType.Not:
                    return Intrinsics.UnaryOperation(closure, operand, unaryExpression.NodeType, opOnesComplement);

                case ExpressionType.ArrayLength:
                    return closure.Unbox <Array>(operand).Length;
                }

                throw new InvalidOperationException(string.Format(Properties.Resources.EXCEPTION_COMPIL_UNKNOWNUNARYEXPRTYPE, unaryExpression.Type));
            });
        }