传递Enum作为参数

时间:2012-04-05 00:42:22

标签: c# types parameters enumeration

我正在努力制作一个简单的Roguelike游戏,以便更好地学习C#。我试图制作一个通用的方法,我可以给它一个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);
}

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

谢谢!

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

2 个答案:

答案 0 :(得分:7)

试试这个:

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

    return Enum.GetNames(type).Length;
}

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

答案 1 :(得分:3)

您也可以使用通用方法执行此操作。就个人而言,我更喜欢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>();
    }