internal static CseObject Negate(CseObject obj) {
CseObject result = (CseObject)obj.Clone();
dynamic value = obj.Value;
double numValue;
if (value is string)
throw new CseLogicException(CseLogicExceptionType.CANT_NEGATE_NON_NUM, value.ToString());
else if (!double.TryParse(value.ToString(), out numValue)) {
MethodInfo mi = value.GetType().GetMethod(OpOverloadNames.UMINUS);
if (null != mi) {
result.Value = value.GetType().InvokeMember(OpOverloadNames.UMINUS, OpOverloadNames.Flags, null, CsEval.evalEnvironment, new object[] { value });
return result;
}
else
throw new CseLogicException(CseLogicExceptionType.CANT_NEGATE_NON_NUM, value.ToString());
}
numValue *= -1;
result.Value = numValue;
try {
result = CastExp.Parse(CsEval.evalEnvironment, value.GetType().Name, result);
}
catch {
if (value.ToString().ToLower().Contains("e"))
result = LiteralExp.ParseEType(numValue.ToString());
else if (value.ToString().Contains("."))
result = LiteralExp.ParseFloatType(numValue.ToString(), null);
else
throw new CseLogicException(CseLogicExceptionType.ERROR_NEGATING_VALUE_OF_TYPE, value.ToString(), value.GetType().Name);
}
return result;
}
}