【问题标题】:C#: Generic list of enum valuesC#:枚举值的通用列表
【发布时间】:2011-10-31 09:03:11
【问题描述】:

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

【问题讨论】:

  • 输入输出示例?即您希望列表类型为SomeEnum,还是byte 等?
  • @MarcGravell 正如我所写,我希望泛型类型是底层类型 - 字节。

标签: c# generics enums


【解决方案1】:

如果你想传入一个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[] 等。

【讨论】:

  • 你可以设置获取 Enum 类型作为泛型参数的方法,但它不会改变任何事情,对吧?
  • @gdoron 确实,拥有它&lt;TEnumType&gt; 不会帮助我们,因为我们不会返回 TEnumType[],而是返回 int[]byte[] 等 - 我们可以'不能通过泛型来判断。
【解决方案2】:

虽然马克的回答没有错,但它有点不必要。 Enum.GetValues(type) 返回一个TEnum[],所以这个方法是不必要的,就好像你知道你可以将TEnum[] 转换为它的底层类型数组一样。

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

是有效的 C#,可以编译并且在运行时不会抛出异常。因为一旦你有了数组就想要一个列表,你可以将它传递给 List&lt;Tunderlying&gt; 构造函数,或者你可以调用 ToArray() 扩展方法。

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

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

但是你必须首先知道底层类型。

【讨论】:

  • 哇,谢谢!但是你仍然不能将强类型列表返回一个函数,对吧?
  • 这是正确的枚举不是传统方式中的泛型类型,如果枚举是泛型的,比如MyEnum: Enum&lt;int&gt;,那么这是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多