有没有办法创建一个获取枚举类型作为参数的方法,并从其值中返回枚举基础类型的泛型列表,无论底层类型是否为int \ short byte等'...
我看到Jon Skeet的this answer,但看起来太复杂了。
答案 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[];
}
但是你必须首先知道基础类型。