Is there a better way to enumerate an enum's values than Enum.GetValues()?
在某些情况下,我希望拥有枚举值的IEnumerable。我通常使用的代码如下:
1
| Enum.GetValues(typeof(MyEnum )).OfType<MyEnum >() |
但不仅是它不太好看看,大多数人将需要几秒钟来理解它做什么。编写代码也是一个巨大的痛苦,尤其是在代码中多次需要它的时候。
为了让我的生活更轻松,我决定写一个这样的扩展方法:
1 2 3 4
| public static IEnumerable <T > GetValues <T >(this T e ) where T : Enum
{
return Enum.GetValues(typeof(T )).OfType<T >();
} |
但我必须去掉where T : Enum部分,因为"约束不能是特殊类"enum"。而且,这也不是我想要的,因为我要写的不是MyEnum.GetValues(),而是MyEnum.Value.GetValues(),这很混乱,也不是很漂亮。
这就引出了一个问题:有没有比使用Enum.GetValues()更好的方法来获取枚举值的IEnumerable?
我真的别无选择,只能做一件事吗?
如果可能的话,我希望有一个统一的解决方案,但是任何解决方案都会受到赞赏。
- "大多数人需要几秒钟来理解它的作用"你为什么这么说?我完全可以理解。我不想自大;我的观点是:开发人员之间有广泛的经验。你不应该担心其他开发人员会怎么想,只要你写的是相当短的语句。理解它是他们的负担。如果你真的认为这不清楚,你可以用评论来装饰它。
- 如果将Helper重命名为Enums,将GetEnumValues重命名为For,它将变短并自动记录:`var firstEnum=Enums.for().first();
- 在标记的副本中有11个不同的答案,大部分(如果不是全部)本质上是打电话给GetValues(),这表明这是最好的。我会使用Cast()而不是OfType(),前者更像常规的演员阵容,后者更像使用as操作符,但没有比这更好的内置选项。但是,请参见stackoverflow.com/a/2632759,了解一个实际将方法调用约束到枚举类型的解决方案。
- 我将指出,至少,如果不想使用扩展方法语法,您不需要使用扩展方法语法。如果它"不漂亮",那么只需写EnumExtensionClass.GetValues(T e)(当然,把EnumExtensionClass缩短到你喜欢的任何长度)。
- 如果您确实喜欢扩展方法语法,那么您不需要关心扩展的内容。这是等价的:public static IEnumerable EnumValues(this object unused) where T : struct { return Enum.GetValues(typeof(T)).OfType(); }现在你几乎可以在任何地方调用this.EnumValues():this是未使用的:)
这是完美的解决方案。.NET此时不提供强类型的Enum.GetValues。人们只需几秒钟就可以理解这一点,因为人们希望.NET现在提供一种类型枚举的强类型枚举。
您按照msdn的建议正确使用了getValues。