Convert Enum to String
As of C#6 the best way to get the name of an enum is the new nameof
operator:
nameof(MyEnum.EnumValue);
// Ouputs
> "EnumValue"
This works at compile time, with the enum being replaced by the string in the compiled result, which in turn means this is the fastest way possible.
Any use of enum names does interfere with code obfuscation, if you consider obfuscation of enum names to be worthwhile or important - that's probably a whole other question.
Works for our project...
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);
}
In my tests, Enum.GetName
was faster and by decent margin. Internally ToString
calls Enum.GetName
. From source for .NET 4.0, the essentials:
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);
}
}
I cant say that is the reason for sure, but tests state one is faster than the other. Both the calls involve boxing (in fact they are reflection calls, you're essentially retrieving field names) and can be slow for your liking.
Test setup: enum with 8 values, no. of iterations = 1000000
Result: Enum.GetName => 700 ms, ToString => 2000 ms
If speed isn't noticeable, I wouldn't care and use ToString
since it offers a much cleaner call. Contrast
Enum.GetName(typeof(Bla), value)
with
value.ToString()
Enum.GetName(...)
This is the most elegant method that is meant for it.
var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);
Although I don't see any issues with calling .ToString()
as it is simply shorter.
var enumValueString = MyEnum.MyValue.ToString();
With new C# 6 syntax you can use:
nameof(MyEnum.MyValue)