获取泛型枚举的基础值

本文关键字:泛型 枚举 获取 | 更新日期: 2023-09-27 18:18:47

我想为给定的通用Enum类型生成底层值和名称的列表。我想要原生的底层值(如object s)。

    public static ReadOnlyCollection<EnumerationMember> ListFromEnum<TEnum>()
    {
        Type enumType = typeof(TEnum);
        if (!enumType.IsEnum)
        {
            throw new InvalidOperationException("TEnum is not an enum");
        }
        Type underlyingType = Enum.GetUnderlyingType(enumType);
        TEnum[] enumValues = (TEnum[])Enum.GetValues(enumType);
        return enumValues
            .Select(ev => new EnumerationMember(
                (???)ev,
                EnumerationExtension.GetDescription(enumType, ev)))
            .ToList()
            .AsReadOnly();
    }
    public class EnumerationMember
    {
        public EnumerationMember(object value, string description)
        {
            this.Value = value;
            this.Description = description;
        }
        public object Value { get; private set; }
        public string Description { get; private set; }
    }

获取泛型枚举的基础值

最简单的:

.Select(ev => Convert.ChangeType(ev, underlyingType))

但是我更倾向于返回一个右类型的数组——你甚至不需要转换步骤:

public static Array ListValuesFromEnum<T>()
{
    Type enumType = typeof(T);
    Type underlyingType = Enum.GetUnderlyingType(enumType);
    Array enumValues = Enum.GetValues(enumType);
    var arr = Array.CreateInstance(underlyingType, enumValues.Length);
    enumValues.CopyTo(arr, 0);
    return arr;
}

下面是一些工作代码,它使用Convert.ChangeType

public static ReadOnlyCollection<EnumerationMember> ListValuesFromEnum<T>()
{
    Type enumType = typeof(T);
    Type underlyingType = Enum.GetUnderlyingType(enumType);
    T[] enumValues = (T[])Enum.GetValues(enumType);
    return enumValues
        .Select(ev => new EnumerationMember(Convert.ChangeType(ev,underlyingType), ev.ToString()))
        .ToList()
        .AsReadOnly();
}        

这里有一个现场演示:http://rextester.com/EHOE12097