C#:枚举值的通用列表

时间:2011-10-31 09:03:12

标签: c# generics enums

有没有办法创建一个获取枚举类型作为参数的方法,并从其值中返回枚举基础类型的泛型列表,无论底层类型是否为int \ short byte等'...
我看到Jon Skeet的this answer,但看起来太复杂了。

2 个答案:

答案 0 :(得分:5)

如果你想传递一个Type,它实际上不是非常有用的通用 - 你必须返回与输入没有直接关系的单一类型 ,因此像:

    public static Array GetUnderlyingEnumValues(Type type)
    {
        Array values = Enum.GetValues(type);
        Type underlyingType = Enum.GetUnderlyingType(type);
        Array arr = Array.CreateInstance(underlyingType, values.Length);
        for (int i = 0; i < values.Length; i++)
        {
            arr.SetValue(values.GetValue(i), i);
        }
        return arr;
    }

这是下面的强类型向量,因此您可以将其强制转换为int[]等。

答案 1 :(得分:2)

虽然马克的答案没有错,但有些不必要。 Enum.GetValues(type)返回TEnum[],因此这种方法没有必要,就像你知道可以将TEnum[]强制转换为其基础类型数组的基础类型一样。

var underlyingArray = (int[])Enum.GetValues(typeof(StringComparison));

是有效的C#,它将编译并且不会在运行时抛出异常。由于您需要一个列表,因此您可以将其传递给List<Tunderlying>构造函数,或者只需调用ToArray()扩展方法。

编辑:你可以编写这样的函数::

public static TUnderlying[] GetValuesAs<TUnderlying>(type enumType)
{
     return Enum.GetValues(enumType) as TUnderlying[];
}

但是你必须首先知道基础类型。