namespace MyNewProjectName.Domain.ValueObjects; /// /// Base class for value objects /// public abstract class ValueObject { protected abstract IEnumerable GetEqualityComponents(); public override bool Equals(object? obj) { if (obj == null || obj.GetType() != GetType()) { return false; } var other = (ValueObject)obj; return GetEqualityComponents().SequenceEqual(other.GetEqualityComponents()); } public override int GetHashCode() { return GetEqualityComponents() .Select(x => x?.GetHashCode() ?? 0) .Aggregate((x, y) => x ^ y); } public static bool operator ==(ValueObject? left, ValueObject? right) { if (left is null && right is null) return true; if (left is null || right is null) return false; return left.Equals(right); } public static bool operator !=(ValueObject? left, ValueObject? right) { return !(left == right); } }