【问题标题】:Passing enums to functions [duplicate]将枚举传递给函数[重复]
【发布时间】:2012-01-14 20:36:10
【问题描述】:

可能重复:
C# Iterating through an enum? (Indexing a System.Array)

我想要做的就是编写一个函数,它可以将任何枚举作为参数并打印该枚举的值,但这似乎不可能:

例如,我想这样做:

void PrintEnumValues(Enum e) { ... }

enum Example1 { a, b }
enum Example2 { one, two }

PrintEnumValues(Example1);
PrintEnumValues(Example2);

这样的事情可能吗?

【问题讨论】:

  • 试着真正写出来,看看你能不能证明自己错了。
  • 您的意思是希望您的输出为“a b”或“a”或“0”或“0 1”? IE。你的意思是打印出整个集合还是只打印一个实例?当你说值是指字符串表示还是 int 时?

标签: c# enums


【解决方案1】:
class Program
{
    enum Example1 { a, b }
    enum Example2 { one, two }

    static void Main()
    {
        PrintEnumValues(default(Example1));
        PrintEnumValues(default(Example2));
    }

    static void PrintEnumValues(Enum e) 
    {
        foreach (var item in Enum.GetValues(e.GetType()))
        {
            Console.WriteLine(item);         
        }
    }
}

【讨论】:

    【解决方案2】:

    可能,但您需要制作 PrintEnumValues 的反射体。

    ...
    PrintEnumValues(typeof(Example1));
    ...
    
    
    void PrintEnumValues(Type type)
    {
     //sample: Enum.GetNames(type)
     //sample: Enum.GetValues(type)
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用Enum.GetValues() 并传递枚举的类型以获取值的数组。

      【讨论】:

        【解决方案4】:

        这是我给你的建议:

        void PrintEnumValues<TEnum>() 
        {
            if (!typeof(Enum).IsAssignableFrom(typeof(TEnum)))
            {
                return;
            }
            foreach (var name in Enum.GetNames(typeof(TEnum)))
            {
                // Print name
            }
        }
        

        这样调用那个函数:

        PrintEnumValues<Example1>(); 
        PrintEnumValues<Example2>(); 
        

        【讨论】:

          【解决方案5】:
              enum Example1 
              { a, b }
              enum Example2 
              { one, two }
          
              public T[] GetEnumMembers<T>() where T : struct
              {
                  T[] values = (T[])Enum.GetValues(typeof(T));
                  return values;
              }
          

          然后将其用作:

              var values = GetEnumMembers<Example1>();
          

          【讨论】:

            【解决方案6】:

            您在评论中说I'm not asking about iterating。所以我假设你想打印“a”:

            PrintEnumValues(Example1.a);
            

            不是

            PrintEnumValues(Example1);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-02-07
              • 2014-07-14
              • 2012-10-29
              • 1970-01-01
              • 2015-12-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多