gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:01:08 28 4
gpt4 key购买 nike

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

而不是这样做:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com