zoukankan      html  css  js  c++  java
  • 自动生成缓存Key值的CacheKeyHelper

        /// <summary>
        /// CacheKeyHelper
        /// </summary>
        public class CacheKeyHelper
        {
            /// <summary>
            /// 域名
            /// </summary>
            const string DomainName = "App";
    
            /// <summary>
            /// 当前类型
            /// </summary>
            private static readonly Type CurrentType = typeof (CacheKeyHelper);
    
            /// <summary>
            /// 获取缓存Key
            /// </summary>
            /// <param name="detailCacheKey">PartialCacheKey</param>
            /// <returns></returns>
            public static string GetCacheKey(string detailCacheKey)
            {
                MethodBase mb = GetCaller();
                if (mb != null && mb.DeclaringType != null)
                {
                    return string.Format("{0}:{1}:{2}:{3}_{4}", DomainName, mb.DeclaringType.Namespace, mb.DeclaringType.Name, mb.Name, detailCacheKey.Md5());
                }
    
                return string.Format("{0}_{1}", DomainName, detailCacheKey.Md5());
            }
    
            /// <summary>
            /// 获取缓存Key
            /// </summary>
            /// <param name="reqObj">reqObj</param>
            /// <param name="properties">properties</param>
            /// <returns>PartialCacheKey</returns>
            public static string GetCacheKey<T>(T reqObj, IEnumerable<string> properties) where T : class
            {
                return GetCacheKey(string.Join("_", properties.Select(p => reqObj.GetPropertyValue(p, "null").ToString())));
            }
    
            /// <summary>
            /// 获取缓存Key
            /// </summary>
            /// <param name="reqObj">reqObj</param>
            /// <returns>PartialCacheKey</returns>
            public static string GetCacheKey<T>(T reqObj) where T : class
            {
                return GetCacheKey(reqObj, typeof(T).GetProperties().Where(p => p.CanRead).Select(q => q.Name));
            }
    
            /// <summary>
            /// 获得非本类的直接调用者
            /// </summary>
            /// <returns></returns>
            private static MethodBase GetCaller()
            {
                var ss = new StackTrace(false);
                var currentClass = ss.GetFrame(0).GetMethod().DeclaringType;  
                MethodBase mb = null;
                var level = 1;
                while (true)
                {
                    //index:0为本身的方法;1为调用方法;2为其上上层,依次类推
                    mb = ss.GetFrame(level).GetMethod();
                    if (mb.DeclaringType == null)
                    {
                        break;
                    }
    
                    if (mb.DeclaringType != CurrentType)
                    {
                        break;
                    }
    
                    level++;
                }
    
                return mb;
            }
        }
  • 相关阅读:
    找出文件1中有而文件2中没有的数据
    读取文件内容返回List<String>类型
    【概率论与数理统计】小结6
    【概率论与数理统计】小结5
    【概率论与数理统计】小结4
    【概率论与数理统计】小结3
    【概率论与数理统计】小结2
    记Angular与Django REST框架的一次合作(2):前端组件化——Angular
    记Angular与Django REST框架的一次合作(1):分离 or 不分离,it's the question
    【概率论与数理统计】小结1
  • 原文地址:https://www.cnblogs.com/zhshlimi/p/7644102.html
Copyright © 2011-2022 走看看