代码之家  ›  专栏  ›  技术社区  ›  Eric Weilnau

将枚举转换为字符串

  •  210
  • Eric Weilnau  · 技术社区  · 17 年前

    在中,这是将枚举转换为字符串的首选方法。网3.5?

    • 枚举。GetName
    • 枚举。格式
    • 方法

    为什么我应该选择其中一个而不是其他?一个人表现更好吗?

    15 回复  |  直到 6 年前
        1
  •  81
  •   Keith    9 年前

    从C#6开始,获取枚举名称的最佳方法是使用new nameof 操作员:

    nameof(MyEnum.EnumValue);
    
    // Ouputs
    > "EnumValue"
    

    这在编译时有效,枚举被编译结果中的字符串替换,这反过来意味着这是最快的方法。

    如果你认为混淆枚举名称是有价值的或重要的,那么使用枚举名称确实会干扰代码混淆——这可能是一个完全不同的问题。

        2
  •  87
  •   Code Maverick Ashish Gupta    12 年前

    为我们的项目工作。..

    public static String convertToString(this Enum eff)
    {
        return Enum.GetName(eff.GetType(), eff);
    }
    
    public static EnumType converToEnum<EnumType>(this String enumValue)  
    {
        return (EnumType) Enum.Parse(typeof(EnumType), enumValue);
    }
    
        3
  •  20
  •   Noctis    12 年前

    枚举。获取名称(…)

    这是最优雅的方法。

    var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);
    

    虽然我看不出打电话有什么问题 .ToString() 因为它只是更短。

    var enumValueString = MyEnum.MyValue.ToString();
    

    使用新的C#6语法,您可以使用:

    nameof(MyEnum.MyValue)
    
        4
  •  18
  •   nawfal Donny V.    12 年前

    在我的测试中, Enum.GetName 速度更快,差距也相当大。在内部 ToString 把…叫做 枚举。GetName . From source 为。NET 4.0,基本要素:

    public override String ToString()
    {
         return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
    }
    
    private static String InternalFormat(RuntimeType eT, Object value)
    {
        if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
        {
            String retval = GetName(eT, value); //<== the one
            if (retval == null)
                return value.ToString();
            else
                return retval;
        }
        else
        {
            return InternalFlagsFormat(eT, value);
        }
    }
    

    我不能肯定这是原因,但测试表明一个比另一个更快。这两个调用都涉及拳击(事实上,它们是反射调用,你基本上是在检索字段名),并且可能会很慢。

    测试设置 :具有8个值的枚举,迭代次数=1000000

    后果 :枚举。获取名称=>700毫秒,ToString=>2000毫秒

    如果速度不明显,我不会在乎和使用 方法 因为它提供了一个更干净的通话。对比

    Enum.GetName(typeof(Bla), value)
    

    具有

    value.ToString()
    
        5
  •  16
  •   jpaugh JotaBe    9 年前

    所有这些最终都会在内部调用一个名为 InternalGetValueAsString .两者之间的区别 ToString 和 GetName 应该是这样 GetName 必须先验证几件事:

    1. 您输入的类型不是null。
    2. 您输入的类型实际上是枚举。
    3. 您传入的值不是null。
    4. 您传入的值属于枚举实际可以用作其基础类型的类型,或者属于枚举本身的类型。使用 GetType 检查此值。

    .ToString 不必担心上述任何问题,因为它是在类本身的实例上调用的,而不是在传入的版本上调用的 .ToString 该方法没有与静态方法相同的验证问题,我的结论是 .ToString 是获取字符串值的最快方法。

        6
  •  15
  •   shA.t Rami Jamleh    10 年前

    我能找到的最好的是 this unrelated question on MSDN ,其中包含一个回答此问题的XML代码段。这些方法都有一个共同的缺陷:它们调用 enum.toString() ,使用时无法正常工作 Dotfuscation 其他问题似乎与间接拳击(GetName和Format)有关。不幸的是,我找不到使用上述任何一种的任何性能原因。

    释义来自 xml snippet ,

    将带框枚举传递给string.Format()或任何其他函数都可能导致 enum.ToString() 被召唤。 这将在Dotfusting时引起问题。你不应该使用 枚举。ToString() , enum.GetNames() , enum.GetName() , enum.Format() 或 enum.Parse() 将枚举转换为字符串。相反,请使用switch语句,并在必要时对名称进行国际化。

        7
  •  15
  •   Andrei    8 年前

    Enum.GetName()

    Format() 实际上只是一个包装 GetName() 具有一些格式化功能(或 InternalGetValueAsString() 确切地说)。 ToString() 几乎与 格式() 我想 获取名称() 这是最好的选择,因为它对任何阅读源代码的人都有明显的作用。

        8
  •  8
  •   DancesWithBamboo    17 年前

    我创建了一个“Description”扩展方法并将其附加到枚举中,这样我就可以获得真正用户友好的命名,其中包括空格和大小写。我从来都不喜欢使用枚举值本身作为可显示文本,因为它是我们开发人员用来创建更可读代码的东西。它不用于UI显示目的。我希望能够更改UI,而无需遍历和更改枚举。

        9
  •  6
  •   Noctis    12 年前

    我不知道“首选”方法是什么(问100个人,得到100个不同的意见),但做最简单、最有效的方法。 GetName 可以工作,但需要更多的按键。 ToString() 这项工作似乎做得很好。

        10
  •  0
  •   Nic    9 年前

    对于VB爱好者:

    EnumStringValue = System.Enum.GetName(GetType(MyEnum), MyEnumValue)
    
        11
  •  0
  •   GlennG    8 年前

    对我来说,转换一个 枚举 向 一串 反之亦然:

    // Sample for Enum.ToString(String)
    using System;
    
    class Sample
    {
        enum Colors {Red, Yellow = 12};
    
        public static void Main()
        {
        Colors myColor = Colors.Yellow;
    
        Console.WriteLine("Colors.Red = {0}", Colors.Red.ToString("d"));
        Console.WriteLine("Colors.Yellow = {0}", Colors.Yellow.ToString("d"));
    
        Console.WriteLine("{0}myColor = Colors.Yellow{0}", Environment.NewLine);
    
        Console.WriteLine("myColor.ToString(\"g\") = {0}", myColor.ToString("g"));
        Console.WriteLine("myColor.ToString(\"G\") = {0}", myColor.ToString("G"));
    
        Console.WriteLine("myColor.ToString(\"x\") = {0}", myColor.ToString("x"));
        Console.WriteLine("myColor.ToString(\"X\") = {0}", myColor.ToString("X"));
    
        Console.WriteLine("myColor.ToString(\"d\") = {0}", myColor.ToString("d"));
        Console.WriteLine("myColor.ToString(\"D\") = {0}", myColor.ToString("D"));
    
        Console.WriteLine("myColor.ToString(\"f\") = {0}", myColor.ToString("f"));
        Console.WriteLine("myColor.ToString(\"F\") = {0}", myColor.ToString("F"));
        }
    }
    /*
    This example produces the following results:
    Colors.Red = 0
    Colors.Yellow = 12
    
    myColor = Colors.Yellow
    
    myColor.ToString("g") = Yellow
    myColor.ToString("G") = Yellow
    myColor.ToString("x") = 0000000C
    myColor.ToString("X") = 0000000C
    myColor.ToString("d") = 12
    myColor.ToString("D") = 12
    myColor.ToString("f") = Yellow
    myColor.ToString("F") = Yellow
    */ 
    

    现在将所选字符串转换回 枚举 你可以 解析 它

    var myYellowEnum = Enum.Parse(typeof (Colors), "Yellow"); // Returns Yellow
    
        12
  •  -1
  •   Brian    11 年前

    这也会奏效。

        List<string> names = Enum.GetNames(typeof(MyEnum)).ToList();
    
    推荐文章