Esempio n. 1
0
 /// <summary>
 /// 不能为空
 /// </summary>
 /// <param name="hashModel"></param>
 public static void ShouldNotNull(this IHashDictionary hashModel)
 {
     if (hashModel == null)
     {
         throw new ArgumentNullException("hashModel");
     }
 }
Esempio n. 2
0
        /// <summary>
        /// 检测是否某一项改变
        /// </summary>
        /// <param name="hashModel"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool CheckChanged(this IHashDictionary hashModel, string key)
        {
            if (hashModel == null || key == null)
            {
                return(false);
            }

            var hashValues = hashModel.GetHashValues();

            if (!hashValues.ContainsKey(key))
            {
                return(false);
            }
            var hashValue  = hashValues[key];
            var properties = hashModel.GetProperties();

            if (!properties.ContainsKey(key))
            {
                //be removed!
                return(true);
            }

            var sameHash = properties[key].VerifyObjectHash(hashValue.Hash);

            if (!sameHash)
            {
                //hash不一样,一定变化
                return(true);
            }

            //哈希值虽然一样,但只要不是初始版本的,都视为变化(新增)
            var initVersion = hashModel.GetVersions().LastOrDefault();

            return(initVersion != hashValue.Version);
        }
Esempio n. 3
0
        /// <summary>
        /// 按照是否包含并且变化决定调用处理程序(如果模型中确实包含某属性,并且确实检测到变化,才调用处理程序)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashModel"></param>
        /// <param name="key"></param>
        /// <param name="proecessAction"></param>
        public static void AutoProcessProperty <T>(this IHashDictionary hashModel, string key, Action <T> proecessAction)
        {
            var value = hashModel.GetValueAs <T>(key);

            if (value != null && hashModel.CheckChanged(key))
            {
                proecessAction(value);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 按照是否包含并且变化决定调用处理程序(如果模型中确实包含某属性,并且确实检测到变化,才调用处理程序)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="hashModel"></param>
        /// <param name="key"></param>
        /// <param name="proecessFunc"></param>
        public static TResult AutoProcessProperty <T, TResult>(this IHashDictionary hashModel, string key, Func <T, TResult> proecessFunc)
        {
            var value = hashModel.GetValueAs <T>(key);

            if (value != null && hashModel.CheckChanged(key))
            {
                return(proecessFunc(value));
            }
            return(default(TResult));
        }
Esempio n. 5
0
 /// <summary>
 /// 按照指示决定是否添加值到属性中
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="hashModel"></param>
 /// <param name="key"></param>
 /// <param name="shouldInclude"></param>
 /// <param name="getFunc"></param>
 /// <returns></returns>
 public static IHashDictionary AutoAddOrUpdate <T>(this IHashDictionary hashModel, string key, Func <string, bool> shouldInclude, Func <T> getFunc)
 {
     if (shouldInclude(key))
     {
         var value      = getFunc();
         var properties = hashModel.GetProperties();
         properties[key] = value;
     }
     return(hashModel);
 }
Esempio n. 6
0
        /// <summary>
        /// 检测是否有任何项改变
        /// </summary>
        /// <param name="hashModel"></param>
        /// <returns></returns>

        public static bool CheckAnyChanged(this IHashDictionary hashModel)
        {
            if (hashModel == null)
            {
                return(false);
            }

            var hashValues = hashModel.GetHashValues();

            foreach (var hashValue in hashValues)
            {
                var changedForKey = CheckChanged(hashModel, hashValue.Key);
                if (changedForKey)
                {
                    return(true);
                }
            }

            return(false);
        }