【发布时间】:2016-11-02 23:21:37
【问题描述】:
在几种情况下,我想要一个IEnumerable<MyEnum> 的枚举值。我通常使用的代码是这样的:
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>();
}
除了我必须去掉where T : Enum 部分,因为“约束不能是特殊类'Enum'”。另外,这不是我想要的,因为我需要写 MyEnum.Value.GetValues() 而不是 MyEnum.GetValues(),这很令人困惑,也不是很漂亮。
这让我想到了这个问题:有没有比使用Enum.GetValues() 更好的方法来获取枚举值的IEnumerable<MyEnum>?
除了Helper.GetEnumValues<MyEnum>(),我真的别无选择吗?
如果可能的话,我想要一个在 Unity 中工作的解决方案,但无论哪种方式,任何解决方案都会受到赞赏。
【问题讨论】:
-
“大多数人需要几秒钟来理解它的作用”你为什么这么说?这对我来说是完全可以理解的。我不想自大。我的观点是:开发人员之间有广泛的经验。只要您编写的语句相当简短,您就不必担心其他开发人员可能会怎么想。理解它是他们的负担。如果你真的认为它不清楚,你可以随时用评论来修饰它。
-
如果您将
Helper重命名为Enums并将GetEnumValues重命名为For,它会变得更短且自记录:`var firstEnum = Enums.For().first( ); -
标记的副本中有 11 个不同的答案,而且大多数(如果不是全部)本质上都是调用
GetValues(),这表明这已经足够好了。我会使用Cast<T>()而不是OfType<T>()——前者更像是一个常规演员,而后者更像是使用as运算符——但没有比这更好的内置选项了。但是,请参阅stackoverflow.com/a/2632759,了解实际上确实将方法调用限制为枚举类型的解决方案。 -
我会指出,至少,如果你不想要,你不需要使用扩展方法语法。如果它“不漂亮”,那么就写
EnumExtensionClass.GetValues<T>(T e)(当然,将EnumExtensionClass缩短为任何你喜欢的)。 -
如果你喜欢扩展方法的语法,你不需要关心你扩展了什么。这等效:
public static IEnumerable<T> EnumValues<T>(this object unused) where T : struct { return Enum.GetValues(typeof(T)).OfType<T>(); }现在您几乎可以在任何地方调用this.EnumValues<MyEnum>():this未使用 :)
标签: c#