【问题标题】:Iterate over enum?迭代枚举?
【发布时间】:2011-02-07 15:10:18
【问题描述】:

我试图遍历一个枚举,并使用它的每个值作为参数调用一个方法。必须有比我现在更好的方法来做到这一点:

foreach (string gameObjectType in Enum.GetNames(typeof(GameObjectType)))
{
     GameObjectType kind = (GameObjectType) Enum.Parse(typeof (GameObjectType), gameObjectType);
     IDictionary<string, string> gameObjectData = PersistentUtils.LoadGameObject(kind, persistentState);
}

//...

public static IDictionary<string, string> LoadGameObject(GameObjectType gameObjectType, IPersistentState persistentState) { /* ... */ }

将枚举名称作为字符串,然后将它们解析回枚举,感觉很可怕。

【问题讨论】:

标签: c# syntax enums


【解决方案1】:

嗯,你可以使用Enum.GetValues

foreach (GameObjectType type in Enum.GetValues(typeof(GameObjectType))
{
    ...
}

虽然它不是强类型的 - 而且 IIRC 很慢。另一种方法是使用我的UnconstrainedMelody project

// Note that type will be inferred as GameObjectType :)
foreach (var type in Enums.GetValues<GameObjectType>())
{
    ...
}

如果您使用枚举进行大量工作,UnconstrainedMelody 是不错的选择,但对于单次使用而言,它可能会有点过分...

【讨论】:

  • 你也不能偷懒,在第二个例子中使用 GameObjectType 代替 var :)
  • @Charles:我这样做是为了证明它确实是强类型的……在第一个版本中,它最终会变成object
  • 好吧,我想这次我会放手的。现在太多的 C# 示例懒惰地使用 var 来处理所有事情。
  • @CharlesBoyung 为什么是懒惰?从代码中消除视觉混乱是一件好事。这避免了像MyLongAndDescriptiveClassName myLongAndDescriptiveClassNameInstance = new MyLongAndDescriptiveClassName(... ) 这样的废话。 (也许是另一个地方的论据)
【解决方案2】:

以防万一其他人疯狂到想要这样做想要在 C++/CLI 中执行此操作,这里有一个可用的端口:

using namespace System;

enum class GameObjectType
{
    num1 = 1,
    num2 = 2,
};

Array^ objectTypes = Enum::GetValues(GameObjectType::typeid);
for each( GameObjectType^ objectType in objectTypes)
{
    // Do something
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 2012-06-08
    • 2013-05-11
    • 2017-02-03
    • 2018-06-02
    • 1970-01-01
    • 2017-05-12
    • 2018-08-29
    相关资源
    最近更新 更多