我一直在尝试创建一个扩展方法,该方法适用于任何枚举,以返回其值。
而不是这样做:
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/