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

标签 c# enums extension-methods

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

而不是这样做:

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

这样做会很好:

new BiasCode().Values()

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

我有一个 .NET fiddle有一个接近的解决方案(代码如下所示)。此代码的问题在于扩展方法返回 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成为方法的泛型类型参数,但随后必须将类型限制为仅枚举类型和 that is not possible in C# .

但是,您可以在实践中足够接近(并添加运行时检查以达到顶峰),因此您可以编写一个像这样工作的方法:

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() 简单地返回一个真实列表关于返回值。

关于c# - 获取任何枚举值的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23794691/

相关文章:

c# - 人们可以使用什么代替枚举来获取智能感知的字符串集合?

c++ - 如何使用枚举有效填充 2D std::array

c# - 何时使用扩展方法?

c# - Entity Framework 查询结果

c# - SQLite 中如何将事务隔离级别设置为 ReadUncommitted?

c - 结构数组 : Structure members are Enum Variables

c# - IEnumerable<TimeSpan> 的 Sum 方法扩展

c# - 调试时检查 IEnumerable "stack"?

c# - "Substring"一个数值

c# - 您可以在类型上而不是在类型的实例上拥有扩展方法吗?