将Enum转换为String

在.NET 3.5中将Enum转换为string的首选方法是什么?

  • Enum.GetName
  • Enum.Format
  • 的toString

为什么我应该比其他人更喜欢其中之一? 一个performance更好吗?

从C#6开始,获取枚举名称的最好方法是运算符的新nameof

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

这在编译时工作,枚举被编译结果中的stringreplace,这意味着这是最快的方式。

任何使用枚举名称都会干扰代码混淆,如果你认为混淆枚举名称是有价值的或重要的 – 这可能是另外一个问题。

为我们的项目工作…

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

所有这些最终都会调用一个名为InternalGetValueAsString的方法。 ToStringGetName之间的区别在于GetName必须首先validation一些事情:

  1. 您input的types不是null。
  2. 你input的types实际上是一个枚举。
  3. 您传入的值不是null。
  4. 您传递的值是枚举实际可以用作底层types或枚举types的types。 它使用GetType来检查这个值。

.ToString不必担心上述任何问题,因为它是在类本身的一个实例上调用的,而不是在传入的版本中调用,因此,由于.ToString方法没有与静态方法相同的validation问题,我会得出结论: .ToString是以stringforms获取值的最快方法。

最好的我能find的是MSDN上的这个无关的问题 ,它包含一个XML代码片段来回答这个问题。 任何这些方法共享相同的缺陷:他们调用enum.toString() ,这在使用Dotfuscation时无法正常工作。 其他问题似乎涉及间接装箱(GetName和格式)。 不幸的是,我找不到使用上述任何性能的原因。

从xml片段中解释 ,

将盒装枚举传递给string.Format()或其他任何函数都会导致调用enum.ToString() 。 这在Dotfuscating时会导致问题。 您不应该使用enum.ToString()enum.GetNames()enum.GetName()enum.Format()enum.Parse()将枚举转换为string。 而是使用switch语句,并在必要时将名称国际化。

在我的testing中, Enum.GetName更快,体面的边缘。 内部的ToString调用Enum.GetName 。 从 .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); } } 

我不能说这是肯定的原因,但testing表明一个比另一个更快。 这两个电话都涉及拳击(实际上他们是reflection电话,你基本上是检索字段名称),并可能会慢你喜欢。

testing设置 :枚举8个值,没有。 迭代= 1000000

结果 :Enum.GetName => 700 ms,ToString => 2000 ms

如果速度不明显,我不会在乎和使用ToString因为它提供了一个更清洁的电话。 对比

 Enum.GetName(typeof(Bla), value) 

 value.ToString() 

Enum.GetName()

Format()实际上只是GetName()一个包装函数,具有一些格式化function(或者说是精确的InternalGetValueAsString() )。 ToString()Format()几乎相同。 我认为GetName()是最好的select,因为对于读取源代码的人来说,它是完全明显的。

我创build一个“描述”扩展方法,并将其附加到枚举,以便我可以得到真正的用户友好的命名,其中包括空间和套pipe。 我从来没有喜欢使用枚举值本身作为可显示的文本,因为这是我们开发人员用来创build更多的可读代码。 它不是用于UI显示的目的。 我希望能够改变用户界面,而无需通过改变枚举。

Enum.GetName(…)

这是最适合的方法。

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

虽然我没有看到调用.ToString()任何问题,因为它只是简短。

 var enumValueString = MyEnum.MyValue.ToString(); 

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

nameof(MyEnum.MyValue)

我不知道“首选”方法是什么(问100个人,得到100个不同的意见),但做什么最简单,什么工作。 GetName作品,但需要更多的击键。 ToString()似乎很好地完成了这项工作。

这也可以。

  List<string> names = Enum.GetNames(typeof(MyEnum)).ToList(); 

简单:列举一个枚举名称:

 List<String> NameList = Enum.GetNames(typeof(YourEnumName)).Cast<string>().ToList()