private TAttribute RetrieveAttribute <TAttribute>(PairKey <Type, Type> key, bool inherit)
            where TAttribute : Attribute
        {
            TAttribute attribute = (TAttribute)Attribute.GetCustomAttribute(key.Left, typeof(TAttribute), inherit);

            return(attribute);
        }
        public override bool Equals(object obj)
        {
            PairKey <TLeft, TRight> other = obj as PairKey <TLeft, TRight>;

            if (other == null)
            {
                return(false);
            }

            return(Equals(left, other.left) && Equals(right, other.right));
        }
        private TAttribute DoGetCustomAttribute <TAttribute>(Type type, Dictionary <PairKey <Type, Type>, Attribute> cache, object lockObject, bool inherit)
            where TAttribute : Attribute
        {
            PairKey <Type, Type> key = new PairKey <Type, Type>(type, typeof(TAttribute));

            Attribute storedObject;
            bool      exists = false;

            lock (lockObject)
            {
                exists = cache.TryGetValue(key, out storedObject);
            }
            if (!exists)
            {
                storedObject = RetrieveAttribute <TAttribute>(key, inherit);
                lock (lockObject)
                {
                    cache[key] = storedObject;
                }
            }

            return(storedObject as TAttribute);
        }
        /// <summary>
        /// Returns true if there is a cached entry for the attribute type for the given type
        /// </summary>
        /// <remarks>
        /// A null cached entry will return true.
        /// </remarks>
        /// <typeparam name="TAttribute">The type of attribute required.</typeparam>
        /// <param name="type">The type to query for the attribute.</param>
        /// <returns><code>true</code> if the result for the attribute query is in the cache.</returns>
        public bool HasCachedCustomAttribute <TAttribute>(Type type)
        {
            PairKey <Type, Type> key = new PairKey <Type, Type>(type, typeof(TAttribute));

            return(this.typeAttributes.ContainsKey(key));
        }