namespace ColaFlow.Shared.Kernel.Common; /// /// Base class for all value objects /// public abstract class ValueObject { protected abstract IEnumerable GetAtomicValues(); public override bool Equals(object? obj) { if (obj == null || obj.GetType() != GetType()) return false; var other = (ValueObject)obj; return GetAtomicValues().SequenceEqual(other.GetAtomicValues()); } public override int GetHashCode() { return GetAtomicValues() .Aggregate(1, (current, obj) => { unchecked { return (current * 23) + (obj?.GetHashCode() ?? 0); } }); } public static bool operator ==(ValueObject? a, ValueObject? b) { if (a is null && b is null) return true; if (a is null || b is null) return false; return a.Equals(b); } public static bool operator !=(ValueObject? a, ValueObject? b) { return !(a == b); } }