AttributeQuery.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. namespace Quadarax.Foundation.Core.Reflection
  5. {
  6. public static class AttributeQuery<TAttributeType> where TAttributeType : Attribute
  7. {
  8. public static TAttributeType Get<TAttributeProvider>(TAttributeProvider oProvider)
  9. where TAttributeProvider : ICustomAttributeProvider
  10. {
  11. return Get(oProvider, true);
  12. }
  13. public static TAttributeType Get<TAttributeProvider>(TAttributeProvider oProvider, bool bInherit)
  14. where TAttributeProvider : ICustomAttributeProvider
  15. {
  16. var attribute = Find(oProvider, bInherit);
  17. if (attribute == null)
  18. {
  19. throw new Exception($"Cannot find attribute '{typeof(TAttributeType).Name}' inside class '{oProvider.GetType().AssemblyQualifiedName}'");
  20. }
  21. return attribute;
  22. }
  23. public static TAttributeType? Find<TAttributeProvider>(TAttributeProvider oProvider, bool bInherit)
  24. where TAttributeProvider : ICustomAttributeProvider
  25. {
  26. var attributes = FindAll(oProvider, bInherit);
  27. return attributes.Length > 0 ? attributes[0] : null;
  28. }
  29. public static TAttributeType?[] FindAll<TAttributeProvider>(TAttributeProvider oProvider)
  30. where TAttributeProvider : ICustomAttributeProvider
  31. {
  32. return FindAll(oProvider, true);
  33. }
  34. public static TAttributeType?[] FindAll<TAttributeProvider>(TAttributeProvider oProvider, bool bInherit)
  35. where TAttributeProvider : ICustomAttributeProvider
  36. {
  37. return (TAttributeType?[])oProvider.GetCustomAttributes(typeof(TAttributeType), bInherit);
  38. }
  39. public static MemberInfo[] GetMembers(Type oSource, BindingFlags eFlags)
  40. {
  41. var oResult = new List<MemberInfo>();
  42. if (oSource.IsEnum)
  43. {
  44. var oMembers = oSource.GetEnumValues();
  45. foreach (var oMember in oMembers)
  46. {
  47. var oMemberInfo = oSource.GetMember(oMember.ToString() ?? string.Empty);
  48. if (Has(oMemberInfo[0]))
  49. oResult.Add(oMemberInfo[0]);
  50. }
  51. return oResult.ToArray();
  52. }
  53. throw new NotSupportedException(
  54. $"Attribute query in GetMembers does't support type object '{oSource.AssemblyQualifiedName}");
  55. }
  56. public static bool Has<TAttributeProvider>(TAttributeProvider oProvider)
  57. where TAttributeProvider : ICustomAttributeProvider
  58. {
  59. return oProvider.IsDefined(typeof(TAttributeType), true);
  60. }
  61. public static bool Has<TAttributeProvider>(TAttributeProvider oProvider, bool bInherit)
  62. where TAttributeProvider : ICustomAttributeProvider
  63. {
  64. return Find(oProvider, bInherit) != null;
  65. }
  66. }
  67. }