将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
的方法。 ToString
和GetName
之间的区别在于GetName
必须首先validation一些事情:
- 您input的types不是null。
- 你input的types实际上是一个枚举。
- 您传入的值不是null。
- 您传递的值是枚举实际可以用作底层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()