public bool IsEqual(object compare, object to)
{
var left = compare as IValueObject;
var right = to as IValueObject;
if (left == null) throw new ArgumentException("Argument is not a valid value object");
if (right == null) throw new ArgumentException("Argument is not a valid value object");
if (left.GetType() != right.GetType()) return false;
if (left.IsEmpty && right.IsEmpty) return true;
if (left.IsEmpty || right.IsEmpty) return false;
return left.Equals(right);
}