AttributeQuery.cs 2.9 KB

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