C# 枚举类型的函数参数

8
作为此问题的后续。
我如何调用一个函数并传递一个枚举?
例如,我有以下代码:
enum e1
{
    //...
}

public void test()
{
    myFunc( e1 );
}

public void myFunc( Enum e )
{
    var names = Enum.GetNames(e.GetType());

    foreach (var name in names)
    {
        // do something!
    }

}

尽管我这样做时收到“e1是'type',但像'variable'一样使用”错误消息。有什么想法可以帮忙吗?
我正在尝试使该函数通用,以便适用于任何枚举类型,而不仅仅是特定类型?这是否可能?...使用通用函数如何?这会起作用吗?

@TK,请看一下我的最近编辑,针对类型安全。 - bruno conde
我想要一个解释“为什么”你想这样做。对我来说,看起来你试图为一个问题寻找解决方案,如果你从几步之前重新考虑你的方法,这个问题本来不存在,所以一个解释可能有助于找到真正问题的解决方案。 - user253984
4个回答

9
为什么不传递类型? 像这样:

 myfunc(typeof(e1));

public void myFunc( Type t )
{
}

如果我使用 "if (e is Enum)" 或者 'as' 语句,则会出现错误 "无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型 'System.Type' 转换为 'System.Enum'"。 - TK.
你仍然可以使用 Enum.GetNames(t)。 - Jon B
我该如何进行类型安全以确保仅使用枚举而不是任何类型? - TK.
使用 typeof(Enum).IsAssignableFrom(t) - 如果 t 不代表枚举类型,则返回 false。 - Andy

9
您可以使用通用函数:
    public void myFunc<T>()
    {
        var names = Enum.GetNames(typeof(T));

        foreach (var name in names)
        {
            // do something!
        }
    }

并且像这样调用:

    myFunc<e1>();

(编辑)

如果您尝试将 T 约束为 Enumenum,编译器会报错。

因此,为确保类型安全性,您可以将函数更改为:

    public static void myFunc<T>()
    {
        Type t = typeof(T);
        if (!t.IsEnum)
            throw new InvalidOperationException("Type is not Enum");

        var names = Enum.GetNames(t);
        foreach (var name in names)
        {
            // do something!
        }
    }

5
您正在尝试将枚举类型的类型作为该类型的实例传递 - 请尝试像这样做:
enum e1
{
    foo, bar
}

public void test()
{
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself
}

public void myFunc(Enum e)
{
    foreach (string item in Enum.GetNames(e.GetType()))
    {
        // Print values
    }
}

我知道我可以像这样传递单个值。我想传递一个通用的枚举到函数中,以便打印所有值而不仅仅是一个。 - TK.
这将打印所有的值。使用Enum.GetNames(e.GetType())。 - Jon B

0

使用

public void myFunc( e1 e ) { // use enum of type e}

替代

public void myFunc( Enum e ) { // use type enum. The same as class or interface. This is not generic! }

我试图使函数通用,以便适用于任何枚举类型,而不仅仅是特定类型。 - TK.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接