C# 是否有更好的方法枚举枚举';s值大于Enum.GetValues()?

C# 是否有更好的方法枚举枚举';s值大于Enum.GetValues()?,c#,C#,有几种情况下,我需要枚举值的IEnumerable。我通常使用的代码如下所示: Enum.GetValues(typeof(MyEnum)).OfType<MyEnum>() public static IEnumerable<T> GetValues<T>(this T e) where T : Enum { return Enum.GetValues(typeof(T)).OfType<T>(); } Enum.GetValues(

有几种情况下,我需要枚举值的
IEnumerable
。我通常使用的代码如下所示:

Enum.GetValues(typeof(MyEnum)).OfType<MyEnum>()
public static IEnumerable<T> GetValues<T>(this T e) where T : Enum
{
    return Enum.GetValues(typeof(T)).OfType<T>();
}
Enum.GetValues(typeof(MyEnum)).OfType()的

但它不仅不好看,大多数人还需要几秒钟来理解它的功能。编写它也是一件非常痛苦的事情,尤其是当您在整个代码中多次需要它时

为了让我的生活更轻松,我决定写一个扩展方法,如下所示:

Enum.GetValues(typeof(MyEnum)).OfType<MyEnum>()
public static IEnumerable<T> GetValues<T>(this T e) where T : Enum
{
    return Enum.GetValues(typeof(T)).OfType<T>();
}
公共静态IEnumerable GetValues(此te),其中T:Enum
{
返回类型()的Enum.GetValues(typeof(T));
}
除了我必须去掉
where T:Enum
部分,因为“约束不能是特殊类'Enum'”。另外,这也不是我想要的,因为我需要编写
MyEnum.Value.GetValues()
,而不是
MyEnum.Value.GetValues()
,这非常混乱,也不是很漂亮

这就引出了一个问题:有没有比使用
enum.GetValues()
更好的方法来获取枚举值的
IEnumerable

我真的别无选择,只能让它成为
Helper.GetEnumValues()


如果可能的话,我想要一个统一的解决方案,但是任何解决方案都会受到欢迎。

这是一个完美的解决方案。Net此时不提供强类型的Enum.GetValues。人们只需几秒钟就能理解它的作用,因为人们希望.Net现在提供一种类型的枚举的强类型枚举


您正确地使用了GetValues作为

“大多数人需要几秒钟来理解它的功能”你为什么这么说?我完全可以理解。我不是想自大;我的观点是:开发人员有着广泛的经验。您不应该担心其他开发人员会怎么想,只要您编写的语句相当简短。理解它是他们的负担。如果你真的认为它不清楚,你可以随时用注释来修饰它。如果你将
Helper
重命名为
Enums
并将
GetEnumValues
重命名为
For
,它会变短并自我记录:`var firstEnum=Enums.For().first();标记的副本中有11个不同的答案,大多数答案(如果不是全部的话)基本上都是调用
GetValues()
,这表明这是最好的答案。我会使用
Cast()
而不是
of type()
——前者更像是常规的强制转换,而后者更像是将
用作
操作符——但没有比这更好的内置选项。但是,请参阅,以获得一个实际将方法调用约束到枚举类型的解决方案。我将指出,如果您不想,至少不需要使用扩展方法语法。如果它“不漂亮”,那么只需编写
EnumExtensionClass.GetValues(te)
(当然,可以将
EnumExtensionClass
缩短为您喜欢的长度)。如果您确实喜欢扩展方法语法,那么您不必关心扩展的内容。这是等效的:
公共静态IEnumerable枚举值(此对象未使用),其中T:struct{return Enum.GetValues(typeof(T)).OfType();}
现在您可以调用
This.EnumValues()
几乎任何地方:
This
未使用:)