C#:枚举值的通用列表

发布于 2024-12-12 12:06:46 字数 233 浏览 0 评论 0原文

有没有办法创建一个方法,该方法获取枚举类型作为参数,并从其值返回枚举基础类型的通用列表,无论基础类型是否为 int\short byte 等'...
我看到了乔恩·斯基特的这个答案,但看起来好像是这样太复杂了。

Is there a way to create a method that gets an enum type as a parameter, and returns a generic list of the enum underlying type from it's values, no matter if the underlying type is int\short byte etc'...
I saw this answer of Jon Skeet, but it looks way too complicated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灯下孤影 2024-12-19 12:06:46

如果您想传递类型,它实际上不能是有用的泛型 - 您必须返回一个与输入不直接相关的类型 ,因此类似于:

    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[] 等。

If you want to pass in a Type, it can't really be usefully generic - you'd have to return a single type that isn't directly related to the input, hence something like:

    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;
    }

This is a strongly-typed vector underneath, so you could cast that to int[] etc.

蓝海似她心 2024-12-19 12:06:46

虽然马克的回答没有错,但有些不必要。
Enum.GetValues(type) 返回一个 TEnum[] 所以这个方法是不必要的,就好像你知道底层类型,你可以直接转换 TEnum[]< /code> 为其基础类型数组。

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

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

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

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

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

While Marc's answer isn't wrong its somewhat unnecessary.
Enum.GetValues(type) returns a TEnum[] so this method is kind of unnecessary as if you know the underlying type you can just cast TEnum[] to its underlying type array.

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

is valid C# that will compile and won't throw an exception at runtime. Since you wanted a list once you have the array you can pass it to the List<Tunderlying> constructor or you can just call the ToArray() extension method.

Edit: you could write the function as such::

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

But then you would have to know the underlying type first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文