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”是一个“类型”,但它被用作“变量”错误消息。有什么想法可以帮助吗?

我试图保持函数通用以在任何 Enum 上工作,而不仅仅是特定类型?这甚至可能吗?...使用通用函数怎么样?这行得通吗?

4

4 回答 4

9

为什么不传递类型?像:

 myfunc(typeof(e1));

public void myFunc( Type t )
{
}
于 2009-02-03T15:02:37.340 回答
9

您可以使用通用函数:

    public void myFunc<T>()
    {
        var names = Enum.GetNames(typeof(T));

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

并调用:

    myFunc<e1>();

(编辑)

如果您尝试约束TEnumor ,编译器会抱怨enum

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

    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!
        }
    }
于 2009-02-03T15:16:56.720 回答
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
    }
}
于 2009-02-03T15:01:03.117 回答
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! }
于 2009-02-03T15:06:04.463 回答