获取任何枚举值的扩展方法

2024-04-17

我一直在尝试创建一个适用于任何枚举的扩展方法,以返回其值。

而不是这样做:

Enum.GetValues(typeof(BiasCode)).Cast<BiasCode>()

这样做会很好:

new BiasCode().Values()

如果没有的话会更好new,但那是另一个问题了。

我有一个.NET 小提琴 https://dotnetfiddle.net/GSnVBD有一个接近的解决方案(代码如下所示)。这段代码的问题是扩展方法正在返回List<int>。我想让它返回枚举值本身的列表。返回List<int>并不可怕;这只是意味着我必须投射结果。

有可能做到这一点吗?我尝试使扩展方法通用,但遇到了问题。这是我所能得到的最接近的结果:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        foreach (int biasCode in new BiasCode().Values())
        {
            DisplayEnum((BiasCode)biasCode);
        }
    }

    public static void DisplayEnum(BiasCode biasCode)
    {
        Console.WriteLine(biasCode);    
    }
}

public enum BiasCode
{
    Unknown,
    OC,
    MPP
}

public static class EnumExtensions
{
    public static List<int> Values(this Enum theEnum)
    {
        var enumValues = new List<int>();
        foreach (int enumValue in Enum.GetValues(theEnum.GetType()))
        {
            enumValues.Add(enumValue);
        }

        return enumValues;
    }
}

您可以返回适当枚举类型的实例(使用反射创建),但其静态类型不能List<EnumType>。那需要EnumType成为方法的泛型类型参数,但类型必须仅限于枚举类型并且这在 C# 中是不可能的 https://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum.

但是,您可以在实践中足够接近(并添加运行时检查来完成它),以便您可以编写一个如下所示的方法:

public static IEnumerable<TEnum> Values<TEnum>()
where TEnum : struct,  IComparable, IFormattable, IConvertible
{
    var enumType = typeof(TEnum);

    // Optional runtime check for completeness    
    if(!enumType.IsEnum)
    {
        throw new ArgumentException();
    }

    return Enum.GetValues(enumType).Cast<TEnum>();
}

你可以用它来调用

var values = Values<BiasCode>();

我已经让方法返回了IEnumerable<TEnum>而不是额外的 LINQ-y 风格的列表,但您可以简单地返回一个真实的列表.ToList()关于返回值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取任何枚举值的扩展方法 的相关文章

随机推荐