我一直在尝试创建一个适用于任何枚举的扩展方法,以返回其值。
而不是这样做:
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(使用前将#替换为@)