如何通过传入枚举值和属性类型来获取枚举的自定义属性?

How to get a custom attribute on enum by passing in the enum value and attribute type?

网上有很多创建枚举扩展方法的示例,该方法将枚举值作为参数并在该方法中获取特定属性,如下所示:

namespace MVVMProj.ProjUtilities
{
  public class EnumerationHelpers
  {
    public static string GetStatusText(this Enum value)
    {
      var type = value.GetType();

      string name = Enum.GetName(type, value);
      if (name == null) { return null; }

      var field = type.GetField(name);
      if (field == null) { return null; }

      var attr = Attribute.GetCustomAttribute(field, typeof(StatusTextAttribute)) as StatusTextAttribute;
      if (attr == null) { return null; }

      return attr.StatusText;
    }
  }
}

我想知道的是,有没有办法将属性类型也传递给方法,这样我就不需要为每个不同的属性编写特定的方法了?

这是未完成的,但是,它应该让您了解我正在努力实现的目标:

namespace MVVMProj.ProjUtilities
{
  public class EnumerationHelpers
  {
    public static string GetCustomAttribute(this Enum value, Type customAttr) 
             //Or instead of passing a Type, a string of the attribute's name
    {
      var type = value.GetType();

      string name = Enum.GetName(type, value);
      if (name == null) { return null; }

      var field = type.GetField(name);
      if (field == null) { return null; }

      var attr = Attribute.GetCustomAttribute(field, ....) as ....;
      if (attr == null) { return null; }

      return attr....;
    }
  }
}

我想我不能只 return 一个字符串,因为它可以是任何数据类型。

也许是一些通用方法?

如有任何建议,我们将不胜感激!

编辑:用法:

它正在遍历枚举以创建字典,因此我可以在组合框中显示值。它仅在属性与 if 语句中的条件匹配时才添加项目。

还有一点要注意,自定义属性也是一个枚举。

Aybe:'item' 只是迭代中的一个对象,所以我进行了转换。虽然我在 if 语句中遇到错误,它试图将 CaseTypeAttribute 与实际的 CaseType 枚举值进行比较,但我需要做什么来解决?

错误:
严重性代码描述项目文件行抑制状态 错误 CS0019 运算符“==”不能应用于 'SBC.CaseTypeAttribute' 和 'SBC.CaseType'

类型的操作数
private Dictionary<int, string> _substancetypes;
public Dictionary<int, string> SubstanceTypes
{
  get
  {
    if (_substancetypes == null)
    {
      _substancetypes = new Dictionary<int, string>();
      foreach (var item in Enum.GetValues(typeof(SBC.SubstanceTypeCode)))
      {
        var descriptionAttribute = ((SBC.SubstanceTypeCode)item).GetAttribute<SBC.CaseTypeAttribute>();
        if (descriptionAttribute != null && 
               descriptionAttribute == SBC.CaseType.Exposures) //Error here
        {
          _substancetypes.Add((int)item, CTS_MVVM.CTS_Utilities.EnumerationHelpers.GetDescriptionFromEnumValue((SBC.SubstanceTypeCode)item));
        }
      }
    }

    return _substancetypes;
  }
}

是这样的吗?

using System;
using System.ComponentModel;
using System.Reflection;

namespace ConsoleApp1
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            var descriptionAttribute = MyEnum.A.GetAttribute<DescriptionAttribute>();
        }
    }

    public static class EnumExtensions
    {
        public static T GetAttribute<T>(this Enum @enum) where T : Attribute
        {
            var type = @enum.GetType();
            var name = Enum.GetName(type, @enum);
            var field = type.GetField(name);
            var attribute = field.GetCustomAttribute<T>();
            return attribute;
        }
    }

    public enum MyEnum
    {
        [Description("A")] A,
        [Description("B")] B
    }
}