public static object Negate(object target)
        {
            if (target == null)
            {
                return(null);
            }

            if (target.GetType().IsCOMObject)
            {
                target = GetDefaultPropertyValue(target);
            }

            return(-(double)BuiltInFunctions.CDbl(target));
        }
        public static object Not(object target)
        {
            if (target == null)
            {
                return(null);
            }

            if (target.GetType().IsCOMObject)
            {
                target = GetDefaultPropertyValue(target);
            }

            return(!(bool)BuiltInFunctions.CBool(target));
        }
        public static object BinaryOp(ExpressionType op, object left, object right)
        {
            if (left == null || right == null)
            {
                if (op == ExpressionType.Equal)
                {
                    if (left == null && right == null)
                    {
                        return(true);
                    }
                    else if (string.Empty.Equals(left) || string.Empty.Equals(right))
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (op == ExpressionType.NotEqual)
                {
                    if (left == null && right == null)
                    {
                        return(false);
                    }
                    else if (string.Empty.Equals(left) || string.Empty.Equals(right))
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }
                }
                else
                {
                    return(null);
                }
            }

            Type ltype = left.GetType();
            Type rtype = right.GetType();

            if (op == ExpressionType.Equal)
            {
                if (left == right)
                {
                    return(true);
                }
            }


            if (ltype.IsCOMObject)
            {
                left  = GetDefaultPropertyValue(left);
                ltype = left.GetType();
            }

            if (rtype.IsCOMObject)
            {
                right = GetDefaultPropertyValue(right);
                rtype = right.GetType();
            }

            if (!ltype.IsValueType && ltype != typeof(string))
            {
                left  = left.ToString();
                ltype = typeof(string);
            }

            if (!rtype.IsValueType && rtype != typeof(string))
            {
                right = right.ToString();
                rtype = typeof(string);
            }

            Type targetType;

            if (ltype == rtype || CanConvert(rtype, ltype))
            {
                targetType = ltype;
            }
            else
            {
                targetType = rtype;
            }

            switch (op)
            {
            case ExpressionType.Add:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) + Convert.ToInt32(right));
                }
                else if (targetType == typeof(double))
                {
                    return(Convert.ToDouble(left) + Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) + Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) + Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) + Convert.ToDecimal(right));
                }
                else if (targetType == typeof(string))
                {
                    return((string)left + (string)right);
                }
                break;

            case ExpressionType.Subtract:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) - Convert.ToInt32(right));
                }
                else if (targetType == typeof(double) || targetType == typeof(string))
                {
                    return(Convert.ToDouble(left) - Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) - Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) - Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) - Convert.ToDecimal(right));
                }
                break;

            case ExpressionType.Multiply:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) * Convert.ToInt32(right));
                }
                else if (targetType == typeof(double) || targetType == typeof(string))
                {
                    return(Convert.ToDouble(left) * Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) * Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) * Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) * Convert.ToDecimal(right));
                }
                break;

            case ExpressionType.Divide:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) / Convert.ToInt32(right));
                }
                else if (targetType == typeof(double) || targetType == typeof(string))
                {
                    return(Convert.ToDouble(left) / Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) / Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) / Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) / Convert.ToDecimal(right));
                }
                break;

            case ExpressionType.Equal:
                try
                {
                    if (targetType == typeof(int))
                    {
                        return(Convert.ToInt32(left) == Convert.ToInt32(right));
                    }
                    else if (targetType == typeof(double))
                    {
                        return(Convert.ToDouble(left) == Convert.ToDouble(right));
                    }
                    else if (targetType == typeof(long))
                    {
                        return(Convert.ToInt64(left) == Convert.ToInt64(right));
                    }
                    else if (targetType == typeof(float))
                    {
                        return(Convert.ToSingle(left) == Convert.ToSingle(right));
                    }
                    else if (targetType == typeof(decimal))
                    {
                        return(Convert.ToDecimal(left) == Convert.ToDecimal(right));
                    }
                    else if (targetType == typeof(string))
                    {
                        return(((string)left).Equals(right));
                    }
                    else if (targetType == typeof(DateTime))
                    {
                        return(Convert.ToDateTime(left) == Convert.ToDateTime(right));
                    }
                    else
                    {
                        return(left == right);
                    }
                }
                catch (Exception ex)
                {
                    return(false);
                }

            case ExpressionType.NotEqual:
                try
                {
                    if (targetType == typeof(int))
                    {
                        return(Convert.ToInt32(left) != Convert.ToInt32(right));
                    }
                    else if (targetType == typeof(double))
                    {
                        return(Convert.ToDouble(left) != Convert.ToDouble(right));
                    }
                    else if (targetType == typeof(long))
                    {
                        return(Convert.ToInt64(left) != Convert.ToInt64(right));
                    }
                    else if (targetType == typeof(float))
                    {
                        return(Convert.ToSingle(left) != Convert.ToSingle(right));
                    }
                    else if (targetType == typeof(decimal))
                    {
                        return(Convert.ToDecimal(left) != Convert.ToDecimal(right));
                    }
                    else if (targetType == typeof(string))
                    {
                        return(!((string)left).Equals(right));
                    }
                    else if (targetType == typeof(DateTime))
                    {
                        return(Convert.ToDateTime(left) != Convert.ToDateTime(right));
                    }
                    else
                    {
                        return(left != right);
                    }
                }
                catch (Exception ex)
                {
                    return(true);
                }

            case ExpressionType.GreaterThan:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) > Convert.ToInt32(right));
                }
                else if (targetType == typeof(double))
                {
                    return(Convert.ToDouble(left) > Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) > Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) > Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) > Convert.ToDecimal(right));
                }
                else if (targetType == typeof(string))
                {
                    int result = ((string)left).CompareTo(right);
                    return(result > 0);
                }
                else if (targetType == typeof(DateTime))
                {
                    return(Convert.ToDateTime(left) > Convert.ToDateTime(right));
                }
                break;

            case ExpressionType.GreaterThanOrEqual:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) >= Convert.ToInt32(right));
                }
                else if (targetType == typeof(double))
                {
                    return(Convert.ToDouble(left) >= Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) >= Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) >= Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) >= Convert.ToDecimal(right));
                }
                else if (targetType == typeof(string))
                {
                    int result = ((string)left).CompareTo(right);
                    return(result >= 0);
                }
                else if (targetType == typeof(DateTime))
                {
                    return(Convert.ToDateTime(left) >= Convert.ToDateTime(right));
                }
                break;

            case ExpressionType.LessThan:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) < Convert.ToInt32(right));
                }
                else if (targetType == typeof(double))
                {
                    return(Convert.ToDouble(left) < Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) < Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) < Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) < Convert.ToDecimal(right));
                }
                else if (targetType == typeof(string))
                {
                    int result = ((string)left).CompareTo(right);
                    return(result < 0);
                }
                else if (targetType == typeof(DateTime))
                {
                    return(Convert.ToDateTime(left) < Convert.ToDateTime(right));
                }
                break;

            case ExpressionType.LessThanOrEqual:
                if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) <= Convert.ToInt32(right));
                }
                else if (targetType == typeof(double))
                {
                    return(Convert.ToDouble(left) <= Convert.ToDouble(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) <= Convert.ToInt64(right));
                }
                else if (targetType == typeof(float))
                {
                    return(Convert.ToSingle(left) <= Convert.ToSingle(right));
                }
                else if (targetType == typeof(decimal))
                {
                    return(Convert.ToDecimal(left) <= Convert.ToDecimal(right));
                }
                else if (targetType == typeof(string))
                {
                    int result = ((string)left).CompareTo(right);
                    return(result <= 0);
                }
                else if (targetType == typeof(DateTime))
                {
                    return(Convert.ToDateTime(left) <= Convert.ToDateTime(right));
                }
                break;

            case ExpressionType.And:
                if (targetType == typeof(bool))
                {
                    return((bool)left && (bool)right);
                }
                else if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) & Convert.ToInt32(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) & Convert.ToInt64(right));
                }
                else
                {
                    return((bool)BuiltInFunctions.CBool(left) && (bool)BuiltInFunctions.CBool(right));
                }
                break;

            case ExpressionType.Or:
                if (targetType == typeof(bool))
                {
                    return((bool)left || (bool)right);
                }
                else if (targetType == typeof(int))
                {
                    return(Convert.ToInt32(left) | Convert.ToInt32(right));
                }
                else if (targetType == typeof(long))
                {
                    return(Convert.ToInt64(left) | Convert.ToInt64(right));
                }
                else
                {
                    return((bool)BuiltInFunctions.CBool(left) || (bool)BuiltInFunctions.CBool(right));
                }
                break;
            }
            throw new ArgumentException(string.Format("Operation {0} between {1} and {2} is not implemeted.", op, ltype.Name, rtype.Name));
        }