public static MethodResultCache GetCache(string methodName)
        {
            if (MethodCaches.ContainsKey(methodName))
            {
                return(MethodCaches[methodName]);
            }
            var cache = new MethodResultCache(methodName);

            MethodCaches.Add(methodName, cache);
            return(cache);
        }
        public override void OnInvoke(MethodInterceptionArgs args)
        {
            var cache     = MethodResultCache.GetCache(args.Method);
            var arguments = args.Arguments.ToList();

            var result = cache.GetCachedResult(arguments);

            if (result != null)
            {
                args.ReturnValue = result;
                return;
            }

            base.OnInvoke(args);

            cache.CacheCallResult(args.ReturnValue, arguments);
        }