【问题标题】:Is there a better way to enumerate an enum's values than Enum.GetValues()? [duplicate]有没有比 Enum.GetValues() 更好的枚举枚举值的方法? [复制]
【发布时间】: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&lt;MyEnum&gt;

除了Helper.GetEnumValues&lt;MyEnum&gt;(),我真的别无选择吗?

如果可能的话,我想要一个在 Unity 中工作的解决方案,但无论哪种方式,任何解决方案都会受到赞赏。

【问题讨论】:

  • “大多数人需要几秒钟来理解它的作用”你为什么这么说?这对我来说是完全可以理解的。我不想自大。我的观点是:开发人员之间有广泛的经验。只要您编写的语句相当简短,您就不必担心其他开发人员可能会怎么想。理解它是他们的负担。如果你真的认为它不清楚,你可以随时用评论来修饰它。
  • 如果您将Helper 重命名为Enums 并将GetEnumValues 重命名为For,它会变得更短且自记录:`var firstEnum = Enums.For().first( );
  • 标记的副本中有 11 个不同的答案,而且大多数(如果不是全部)本质上都是调用 GetValues(),这表明这已经足够好了。我会使用Cast&lt;T&gt;() 而不是OfType&lt;T&gt;()——前者更像是一个常规演员,而后者更像是使用as 运算符——但没有比这更好的内置选项了。但是,请参阅stackoverflow.com/a/2632759,了解实际上确实将方法调用限制为枚举类型的解决方案。
  • 我会指出,至少,如果你不想要,你不需要使用扩展方法语法。如果它“不漂亮”,那么就写EnumExtensionClass.GetValues&lt;T&gt;(T e)(当然,将EnumExtensionClass 缩短为任何你喜欢的)。
  • 如果你喜欢扩展方法的语法,你不需要关心你扩展了什么。这等效:public static IEnumerable&lt;T&gt; EnumValues&lt;T&gt;(this object unused) where T : struct { return Enum.GetValues(typeof(T)).OfType&lt;T&gt;(); } 现在您几乎可以在任何地方调用this.EnumValues&lt;MyEnum&gt;()this 未使用 :)

标签: c#


【解决方案1】:

这是完美的解决方案。 .Net 目前不提供强类型 Enum.GetValues。人们只需要几秒钟就可以理解这是做什么的,因为人们希望 .Net 现在能够提供一种类型的 Enum 的强类型枚举。

您正确地使用 GetValues 作为MSDN suggests

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 1970-01-01
    • 2020-03-03
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多