如何获得枚举值属性的IEnumerable <string>?

我有一个枚举值的StringValue属性,所以我可以附加一个描述到每个值:

public class StringValueAttribute : Attribute
{
    public string Value { get; private set; }

    public StringValueAttribute(string value)
    {
        Value = value;
    }
}

这就是我使用它的方式:

enum Group
{
    [StringValue("Computer Science")]
    ComputerScience,

    [StringValue("Software Engineering")]
    SoftwareEngineering,

    // ... additional values follow.
}

我有一个方法可以检索给定枚举值的StringValue

public static string GetStringValue(Enum value)
{
    Type type = value.GetType();
    FieldInfo fieldInfo = type.GetField(type.ToString());
    StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

    string stringValue = null;
    if (attributes.Length > 0)
    {
        stringValue = attributes[0].Value;
    }

    return stringValue;
}

我想要另一个获取枚举的方法(枚举本身,而不是一个值),并使用GetStringValue方法检索IEnumerable 。 我不知道如何做到这一点。 这样的方法怎么样?


编辑:这个问题不是重复的如何从值获取C#枚举描述? 我知道如何得到一个枚举属性值,而且我在问题中确实有一个方法。 我的问题是如何列举枚举中的所有属性。


最直接的方法是使用泛型,尽管您总是可以传入特定Enum的实例,获取其类型,然后返回所有值的StringValue值:

public static class EnumExtensions
{
    public static IEnumerable<string> GetStringValues<TEnum>() where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        return Enum.GetValues(typeof(TEnum))
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static IEnumerable<string> GetStringValuesOfType(Enum value)
    {
        return Enum.GetValues(value.GetType())
            .Cast<Enum>()
            .Select(e => e.GetStringValue())
            .ToList();
    }

    public static string GetStringValue(this Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

        string stringValue = null;
        if (attributes.Length > 0)
        {
            stringValue = attributes[0].Value;
        }

        return stringValue;
    }
}

笔记:

  • 在c#中没有where TEnum : Enum约束。 将TEnum限制为struct, IConvertible, IComparable, IFormattable就足够了。

  • 这就是说,将C ++中的Enum类型约束应用于此答案中显示的enum约束有一个狡猾的窍门,即SLak。 (我没有在这个答案中使用它,因为它非常狡猾。)

  • 正如在@ EdPlunkett的评论中指出的那样,您需要将value.ToString()传递给type.GetField()因为您正在获取与该特定传入enum值相对应的字段。

  • 样品小提琴


    这应该工作:

    static void Main(string[] args)
    {
        foreach (var item in GetStringNames<Group>())
        {
            Console.WriteLine(item);
        }
    }
    public static string GetStringValue(Enum value)
    {
        Type type = value.GetType();
        FieldInfo fieldInfo = type.GetField(value.ToString());
        StringValueAttribute[] attributes = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
    
        string stringValue = null;
        if (attributes.Length > 0)
        {
            stringValue = attributes[0].Value;
        }
    
        return stringValue;
    }
    
    public static IEnumerable<string> GetStringNames<T>()
    {
        var type = typeof(T);
    
        if (type.IsEnum == false)
        {
            throw new ArgumentException("T must be an Enum type");
        }
    
        var values = type.GetEnumValues();
    
        foreach (var item in values)
        {
            yield return GetStringValue((Enum)item);
        }
    }
    
    链接地址: http://www.djcxy.com/p/91543.html

    上一篇: How to get an IEnumerable<string> of enum values attributes?

    下一篇: Can you access a long description for a specific enum value