diff --git a/ICD.Common.Utils/AttributeUtils.cs b/ICD.Common.Utils/AttributeUtils.cs index 20260b4..cfefd03 100644 --- a/ICD.Common.Utils/AttributeUtils.cs +++ b/ICD.Common.Utils/AttributeUtils.cs @@ -2,10 +2,7 @@ using System.Collections.Generic; using System.Linq; using ICD.Common.Properties; -using ICD.Common.Utils.Collections; using ICD.Common.Utils.Extensions; -using ICD.Common.Utils.Services; -using ICD.Common.Utils.Services.Logging; #if SIMPLSHARP using Crestron.SimplSharp.Reflection; #else @@ -20,139 +17,6 @@ namespace ICD.Common.Utils /// public static class AttributeUtils { - // Avoid caching the same assembly multiple times. - private static readonly IcdHashSet s_CachedAssemblies; - private static readonly IcdHashSet s_CachedTypes; - - private static readonly Dictionary s_AttributeToTypeCache; - private static readonly Dictionary> s_TypeToAttributesCache; - - private static ILoggerService Logger { get { return ServiceProvider.TryGetService(); } } - - /// - /// Constructor. - /// - static AttributeUtils() - { - s_CachedAssemblies = new IcdHashSet(); - s_CachedTypes = new IcdHashSet(); - - s_AttributeToTypeCache = new Dictionary(); - s_TypeToAttributesCache = new Dictionary>(); - } - - #region Caching - - /// - /// Pre-emptively caches the given assembly for lookup. - /// - /// - public static bool CacheAssembly(Assembly assembly) - { - if (assembly == null) - throw new ArgumentNullException("assembly"); - - if (s_CachedAssemblies.Contains(assembly)) - return true; - - s_CachedAssemblies.Add(assembly); - -#if SIMPLSHARP - CType[] types; -#else - Type[] types; -#endif - try - { - types = assembly.GetTypes(); - } -#if STANDARD - catch (ReflectionTypeLoadException e) - { - foreach (Exception inner in e.LoaderExceptions) - { - if (inner is System.IO.FileNotFoundException) - { - Logger.AddEntry(eSeverity.Error, - "{0} failed to cache assembly {1} - Could not find one or more dependencies by path", - typeof(AttributeUtils).Name, assembly.GetName().Name); - continue; - } - - Logger.AddEntry(eSeverity.Error, inner, "{0} failed to cache assembly {1}", typeof(AttributeUtils).Name, - assembly.GetName().Name); - } - - return false; - } -#endif - catch (TypeLoadException e) - { -#if SIMPLSHARP - Logger.AddEntry(eSeverity.Error, e, "{0} failed to cache assembly {1}", typeof(AttributeUtils).Name, - assembly.GetName().Name); -#else - Logger.AddEntry(eSeverity.Error, e, "{0} failed to cache assembly {1} - could not load type {2}", - typeof(AttributeUtils).Name, assembly.GetName().Name, e.TypeName); -#endif - return false; - } - - foreach (var type in types) - CacheType(type); - - return true; - } - - /// - /// Pre-emptively caches the given type for lookup. - /// - /// -#if SIMPLSHARP - public static void CacheType(CType type) -#else - public static void CacheType(Type type) -#endif - { - if (type == null) - throw new ArgumentNullException("type"); - - if (s_CachedTypes.Contains(type)) - return; - - s_CachedTypes.Add(type); - - try - { - s_TypeToAttributesCache[type] = new IcdHashSet(type.GetCustomAttributes(false)); - foreach (Attribute attribute in s_TypeToAttributesCache[type]) - s_AttributeToTypeCache[attribute] = type; - } - // GetMethods for Open Generic Types is not supported. - catch (NotSupportedException) - { - } - // Not sure why this happens :/ - catch (InvalidProgramException) - { - } - } - - #endregion - - #region Lookup - - /// - /// Gets the class attributes of the given generic type. - /// - /// - /// - public static IEnumerable GetClassAttributes() - { - return s_AttributeToTypeCache.Select(kvp => kvp.Key) - .OfType(); - } - /// /// Gets the first attribute on the given class type matching the generic type. /// @@ -162,56 +26,29 @@ namespace ICD.Common.Utils [CanBeNull] public static T GetClassAttribute(Type type) { - if (type == null) - throw new ArgumentNullException("type"); - - return GetClassAttributes(type).FirstOrDefault(); + return GetClassAttribute(type, false); } /// - /// Gets the attributes on the given class type matching the generic type. + /// Gets the first attribute on the given class type matching the generic type. /// /// /// + /// /// - public static IEnumerable GetClassAttributes(Type type) + [CanBeNull] + public static T GetClassAttribute(Type type, bool inherit) { if (type == null) throw new ArgumentNullException("type"); - return GetClassAttributes(type).OfType(); - } - - /// - /// Gets the attributes on the given class. - /// - /// - /// - public static IEnumerable GetClassAttributes(Type type) - { - if (type == null) - throw new ArgumentNullException("type"); - - CacheType(type); - - IcdHashSet attributes; - - return s_TypeToAttributesCache.TryGetValue(type, out attributes) - ? attributes.ToArray(attributes.Count) - : Enumerable.Empty(); - } - - /// - /// Gets the type with the given attribute. - /// - /// - /// - public static Type GetClass(Attribute attribute) - { - if (attribute == null) - throw new ArgumentNullException("attribute"); - - return s_AttributeToTypeCache[attribute]; +// ReSharper disable InvokeAsExtensionMethod + return ReflectionExtensions.GetCustomAttributes( +#if SIMPLSHARP + (CType) +#endif + type, inherit).FirstOrDefault(); +// ReSharper restore InvokeAsExtensionMethod } /// @@ -237,7 +74,5 @@ namespace ICD.Common.Utils .Where(p => ReflectionExtensions.GetCustomAttributes(p, inherit).Any()); // ReSharper restore InvokeAsExtensionMethod } - - #endregion } } diff --git a/ICD.Common.Utils/Extensions/ReflectionExtensions.cs b/ICD.Common.Utils/Extensions/ReflectionExtensions.cs index 6ed8d6c..367534e 100644 --- a/ICD.Common.Utils/Extensions/ReflectionExtensions.cs +++ b/ICD.Common.Utils/Extensions/ReflectionExtensions.cs @@ -21,7 +21,6 @@ namespace ICD.Common.Utils.Extensions /// /// public static IEnumerable GetCustomAttributes(this ICustomAttributeProvider extends) - where T : Attribute { if (extends == null) throw new ArgumentNullException("extends"); @@ -59,7 +58,6 @@ namespace ICD.Common.Utils.Extensions /// /// public static T GetCustomAttribute(this ICustomAttributeProvider extends) - where T : Attribute { if (extends == null) throw new ArgumentNullException("extends"); @@ -75,7 +73,6 @@ namespace ICD.Common.Utils.Extensions /// /// public static T GetCustomAttribute(this ICustomAttributeProvider extends, bool inherits) - where T : Attribute { if (extends == null) throw new ArgumentNullException("extends");