1.如何设置所有实体的基本类:先看下面的代码
namespace NStudy.core {
public abstract class Entity<TId> {
public virtual TId Id { get; protected set; }
public override bool Equals(object obj) {
return Equals(obj as Entity<TId>);
}
private static bool IsTransient(Entity<TId> obj) {
return obj != null &&
Equals(obj.Id, default(TId));
}
private Type GetUnproxiedType() {
return GetType();
}
public virtual bool Equals(Entity<TId> other) {
if (other == null)
return false;
if (ReferenceEquals(this, other))
return true;
if (!IsTransient(this) &&
!IsTransient(other) &&
Equals(Id, other.Id)) {
var otherType = other.GetUnproxiedType();
var thisType = GetUnproxiedType();
return thisType.IsAssignableFrom(otherType) ||
otherType.IsAssignableFrom(thisType);
}
return false;
}
public override int GetHashCode() {
if (Equals(Id, default(TId)))
return base.GetHashCode();
return Id.GetHashCode();
}
}
}
2.在当前的文件中再加一个类:
public abstract class Entity : Entity<Guid> {
}
先看看Equals方法:
1.other为空的话,就不用比较了,直接返回不相等的结果。
2.ReferenceEquals(this,other)2个引用都是同一个对象更不用说了,返回相等。
3.IsTransient(Entity<TId>obj)用来查看对象是不是不需要持久化到数据库中的对象,不需要持久化到数据库中的对象,不做考虑,直接返回不相等了。
4. Equals(Id,other.Id)值类型直接返回值的比较结果。这个要相等先
5.GetUnproxiedType()返回当前类的类型,不会返回代理类的类型(ProductProxy12398712938之类的类型)。保证thisType.IsAssignableFrom(otherType)和otherType.IsAssignableFrom(thisType)所得到到类型是基本类型,而不是代理类型。
实际上是访问几倍的gettype这个是穿过一层的关系访问基类????
然后的话就是添加gethash方法了,这个实现了equel方法的类必须实现的方法