public override bool Equals(object obj)
{
if (obj == null) return false;
Type compareType = typeof(ScalarValue);
if (compareType.IsInstanceOfType(obj))
{
var val = obj as ScalarValue;
if (IsInt && val.IsInt)
{
return GetIntValue() == val.GetIntValue();
}
// ReSharper disable once CompareOfFloatsByEqualityOperator
return GetDoubleValue() == val.GetDoubleValue();
}
else
{
const BindingFlags FLAGS = BindingFlags.ExactBinding | BindingFlags.Static | BindingFlags.Public;
MethodInfo converter = typeof(ScalarValue).GetMethod("op_Implicit", FLAGS, null, new[] { obj.GetType() }, null);
if (converter != null)
{
var val = (ScalarValue)converter.Invoke(null, new[] { obj });
if (Value == val.Value) return true;
}
}
return false;
}