using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PalGain.Core
{
[Serializable]
public abstract class BaseEntity
{
///
/// Gets or sets the entity identifier
///
public int Id { get; set; }
//public DateTime? SaveTime { get; set; }
//public string EntityRemark { get; set; }
public T TransferFrom() where T : BaseEntity
{
return TransferFrom((T)this, new string[] { "" });
}
public T TransferFrom(string[] ignoreItems) where T : BaseEntity
{
return TransferFrom((T)this, ignoreItems);
}
public T TransferFrom(T source)
{
return TransferFrom(source, new string[] { "" });
}
public T TransferFrom(T source, string[] ignoreItems)
{
T t = Activator.CreateInstance();
return TransferFrom(t, source, ignoreItems);
}
public T TransferFrom(T target, T source)
{
return TransferFrom(target, source, new string[] { "" });
}
public virtual T TransferFrom(T target, T source, string[] ignoreItems)
{
BatchService.Framework.Utility.ClassValueCopier.Mapper
(target, source, ignoreItems);
return target;
}
public override bool Equals(object obj)
{
return Equals(obj as BaseEntity);
}
private static bool IsTransient(BaseEntity obj)
{
return obj != null && Equals(obj.Id, default(int));
}
public virtual T GetEntity() where T : BaseEntity
{
return default(T);
}
private Type GetUnproxiedType()
{
return GetType();
}
public virtual bool Equals(BaseEntity 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(int)))
return base.GetHashCode();
return Id.GetHashCode();
}
public static bool operator ==(BaseEntity x, BaseEntity y)
{
return Equals(x, y);
}
public static bool operator !=(BaseEntity x, BaseEntity y)
{
return !(x == y);
}
public void Save(IRespository respostitory, string[] ignoreProperites) where T : BaseEntity
{
if (this.Id == 0)
{
respostitory.Insert((T)this);
}
else
{
var exist = respostitory.GetById(this.Id);
BatchService.Framework.Utility.ClassValueCopier.Mapper((T)exist, (T)this, ignoreProperites);
respostitory.Update(exist);
}
}
public void Save(IRespository respostitory) where T : BaseEntity
{
this.Save(respostitory, new string[] { "" });
}
}
}