///
/// <summary>
/// Applies numeric affirmation (i.e. unary plus) to numeric values
/// </summary>
///
/// <param name="obj">The CseObject with the value to affirm</param>
///
/// <returns>The CseObject after affirmation</returns>
///
/// <exception cref="CseLogicExceptionType.CANT_AFFIRM_NON_NUM" />
///
internal static CseObject Affirm(CseObject obj)
{
CseObject result = (CseObject)obj.Clone();
dynamic value = obj.Value;
double numValue;
if (value is string)
{
throw new CseLogicException(CseLogicExceptionType.CANT_AFFIRM_NON_NUM, value.ToString());
}
else if (!double.TryParse(value.ToString(), out numValue))
{
MethodInfo mi = value.GetType().GetMethod(OpOverloadNames.UPLUS);
if (null != mi)
{
result.Value = value.GetType().InvokeMember(OpOverloadNames.UPLUS, OpOverloadNames.Flags, null, CsEval.evalEnvironment, new object[] { value });
return(result);
}
else
{
throw new CseLogicException(CseLogicExceptionType.CANT_AFFIRM_NON_NUM, value.ToString());
}
}
return(result);
}