using System.Linq; namespace Kean.Domain { /// /// 值对象 /// public abstract class ValueObject { /// /// 相等运算符 /// /// 运算符左侧值对象 /// 运算符右侧值对象 /// 运算结果 public static bool operator ==(ValueObject left, ValueObject right) { if (left is null ^ right is null) { return false; } return left.Equals(right); } /// /// 不等运算符 /// /// 运算符左侧值对象 /// 运算符右侧值对象 /// 运算结果 public static bool operator !=(ValueObject left, ValueObject right) { return !(left == right); } /// /// 指定的值对象是否等于当前值对象 /// /// 与当前值对象比较的值对象 /// 比较结果 public override bool Equals(object obj) { if (obj == null || obj.GetType() != GetType()) { return false; } else { return ReferenceEquals(this, obj) || GetType().GetProperties().All(p => p.GetValue(this) == p.GetValue(obj)); } } /// /// 返回此值对象的哈希代码 /// /// 32 位有符号整数哈希代码 public override int GetHashCode() => GetType().GetProperties().Select(p => { var v = p.GetValue(this); return p == null ? 0 : p.GetHashCode(); }).Aggregate((a, s) => a ^ s); } }