【问题标题】:c# Enum Function Parametersc# 枚举函数参数
【发布时间】:2009-02-03 14:58:05
【问题描述】:

作为this question.的后续报道

如何调用函数并传入枚举?

例如我有以下代码:

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 上工作,而不仅仅是特定类型?这甚至可能吗?...使用通用函数怎么样?这行得通吗?

【问题讨论】:

  • @TK,查看我最近对 ​​typesafe 的编辑。
  • 我想解释一下为什么你想这样做。在我看来,如果您从之前的几个步骤重新考虑您的方法,那么您似乎试图为一个不存在的问题找到解决方案,因此解释可能有助于找到真正问题的解决方案。

标签: c# enums function-parameter


【解决方案1】:

您可以使用通用函数:

    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!
        }
    }

【讨论】:

    【解决方案2】:

    为什么不传递类型? 喜欢:

     myfunc(typeof(e1));
    
    public void myFunc( Type t )
    {
    }
    

    【讨论】:

    • 如果我使用“if (e is Enum)”或“as”语句,则会收到错误“无法通过引用转换将类型 'System.Type' 转换为 'System.Enum' 、装箱转换、拆箱转换、包装转换或空类型转换”
    • 你仍然可以使用 Enum.GetNames(t)
    • 我怎样才能对它进行类型安全以确保只使用枚举而不是任何类型?
    • 使用 typeof(Enum).IsAssignableFrom(t) - 将返回 false 的 t 不代表 Enum 类型。
    【解决方案3】:

    您正在尝试将枚举的类型作为该类型的实例传递 - 尝试如下操作:

    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
        }
    }
    

    【讨论】:

    • 我知道我可以像这样传递单个值。我希望将一个通用枚举传递给一个函数来打印所有的值,而不仅仅是一个。
    • 这将打印所有值。使用 Enum.GetNames(e.GetType())。
    【解决方案4】:

    使用

    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! }
    

    【讨论】:

    • 我试图让函数通用以适用于任何 Enum 而不仅仅是特定类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2021-11-15
    相关资源
    最近更新 更多