123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- using Ant.Common;
- using Ant.Descriptors;
- using Ant.ORM;
- using Ant.Utility;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- namespace Ant.Core
- {
- /// <summary>
- ///
- /// </summary>
- public interface IEntityState
- {
- /// <summary>
- ///
- /// </summary>
- object Entity { get; }
- /// <summary>
- ///
- /// </summary>
- MetaData TypeDescriptor { get; }
- /// <summary>
- ///
- /// </summary>
- /// <param name="memberDescriptor"></param>
- /// <param name="val"></param>
- /// <returns></returns>
- bool HasChanged(MappingMemberDescriptor memberDescriptor, object val);
- /// <summary>
- ///
- /// </summary>
- void Refresh();
- }
- class EntityState : IEntityState
- {
- Dictionary<MemberInfo, object> _fakes;
- object _entity;
- MetaData _typeDescriptor;
- public EntityState(MetaData typeDescriptor, object entity)
- {
- this._typeDescriptor = typeDescriptor;
- this._entity = entity;
- this.Refresh();
- }
- public object Entity { get { return this._entity; } }
- public MetaData TypeDescriptor { get { return this._typeDescriptor; } }
- public bool HasChanged(MappingMemberDescriptor memberDescriptor, object val)
- {
- object oldVal;
- if (!this._fakes.TryGetValue(memberDescriptor.MemberInfo, out oldVal))
- {
- return true;
- }
- if (memberDescriptor.MemberInfoType == UtilConstants.TypeOfByteArray)
- {
- //byte[] is a big big hole~
- return !AreEqual((byte[])oldVal, (byte[])val);
- }
- return !AntUtils.AreEqual(oldVal, val);
- }
- public void Refresh()
- {
- Dictionary<MemberInfo, MappingMemberDescriptor> mappingMemberDescriptors = this.TypeDescriptor.FiledMeta.MappingMemberDescriptors;
- if (this._fakes == null)
- {
- this._fakes = new Dictionary<MemberInfo, object>(mappingMemberDescriptors.Count);
- }
- else
- {
- this._fakes.Clear();
- }
- object entity = this._entity;
- foreach (var kv in mappingMemberDescriptors)
- {
- MemberInfo key = kv.Key;
- MappingMemberDescriptor memberDescriptor = kv.Value;
- var val = memberDescriptor.GetValue(entity);
- //I hate the byte[].
- if (memberDescriptor.MemberInfoType == UtilConstants.TypeOfByteArray)
- {
- val = Clone((byte[])val);
- }
- this._fakes[key] = val;
- }
- }
- static byte[] Clone(byte[] arr)
- {
- if (arr == null)
- return null;
- byte[] ret = new byte[arr.Length];
- for (int i = 0; i < arr.Length; i++)
- {
- ret[i] = arr[i];
- }
- return ret;
- }
- static bool AreEqual(byte[] obj1, byte[] obj2)
- {
- if (obj1 == obj2)
- return true;
- if (obj1 != null && obj2 != null)
- {
- if (obj1.Length != obj2.Length)
- return false;
- for (int i = 0; i < obj1.Length; i++)
- {
- if (obj1[i] != obj2[i])
- return false;
- }
- return true;
- }
- return false;
- }
- }
- }
|