【问题标题】:Passing an Enum as an argument将枚举作为参数传递
【发布时间】:2012-04-18 18:12:58
【问题描述】:

我正在尝试制作一个简单的 Roguelike 游戏来更好地学习 C#。我正在尝试创建一个通用方法,我可以给它一个 Enum 作为参数,它将返回该 Enum 中有多少元素作为 int。我需要使其尽可能通用,因为我将有几个不同的类调用该方法。

我已经搜索了大约一个小时左右,但我在这里找不到任何资源或其他可以完全回答我的问题的资源......我仍处于 C# 的初级到中级阶段,所以我仍然学习事物的所有语法,但这是我目前所掌握的:

// Type of element
public enum ELEMENT
{
    FIRE, WATER, AIR, EARTH
}


// Counts how many different members exist in the enum type
public int countElements(Enum e)
{
    return Enum.GetNames(e.GetType()).Length;
}


// Call above function
public void foo()
{
    int num = countElements(ELEMENT);
}

编译时出现错误“参数 1:无法从 'System.Type' 转换为 'System.Enum'”。我有点明白为什么它不起作用,但我只需要一些指导来正确设置所有内容。

谢谢!

PS:是否可以在运行时更改枚举的内容?程序正在执行时?

【问题讨论】:

  • 在运行时修改枚举的目的是什么?没有代码会使用附加值,使用修改/删除值的代码会中断。如果您想拥有可以在运行时动态更改的数据元素列表,请使用数据库。
  • 我正在尝试在较小的范围内模拟矮人要塞。您可以通过游戏在启动时解析的某种平面文本文件来更改各种内容。不确定他们是如何设置的,尽管我的猜测是,如果你必须对 Enums 进行硬编码才能使用它们,那么它就不会和它们一起使用......也许是一本字典?

标签: c# types parameters enumeration


【解决方案1】:

试试这个:

public int countElements(Type type)
{
    if (!type.IsEnum)
        throw new InvalidOperationException();

    return Enum.GetNames(type).Length;
}

public void foo()
{
    int num = countElements(typeof(ELEMENT));
}

【讨论】:

  • Anthony:完美,按预期编译和工作。 :D 大卫:我正在尝试在较小的范围内模仿矮人要塞。您可以通过游戏在启动时解析的某种平面文本文件来更改各种内容。不确定他们是如何设置的,尽管我的猜测是,如果你必须对 Enums 进行硬编码才能使用它们,那么它就不会与它们一起使用。
  • 我不知道类型上的 IsEnum,它从 4.0 开始就存在了。很高兴拥有。
【解决方案2】:

您也可以使用通用方法来执行此操作。我个人更喜欢 foo() 方法的语法,因为您不必指定 typeof()

    // Counts how many different members exist in the enum type
    public int countElements<T>()
    {
        if(!typeof(T).IsEnum)
            throw new InvalidOperationException("T must be an Enum");
        return Enum.GetNames(typeof(T)).Length;
    }

    // Call above function
    public void foo()
    {
        int num = countElements<ELEMENT>();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多