44 lines
1.0 KiB
C#
44 lines
1.0 KiB
C#
namespace MyNewProjectName.Domain.ValueObjects;
|
|
|
|
/// <summary>
|
|
/// Base class for value objects
|
|
/// </summary>
|
|
public abstract class ValueObject
|
|
{
|
|
protected abstract IEnumerable<object?> 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);
|
|
}
|
|
}
|