Basically a series of titles will be passed into the switch statement and I need to compare them against the string values of the enum. But I have little to no idea how to do th
I found that the best way for me to do this is by using the System.ComponentModel.DescriptionAttribute
attribute on the enum values.
Here is an example:
using System.ComponentModel;
public enum ActionCode
{
[Description("E")]
Edit,
[Description("D")]
Delete,
[Description("R")]
Restore
}
Then, to use it, create an extension method on a static class like so:
Edit: I rewrote the method to include a great suggestion from Laurie Dickinson so that the method returns the name of the enum value when there is no Description attribute. I also refactored the method to try to improve functionality. It now works for all Enums without using IConvertible
.
public static class Extensions
{
public static string GetDescription(this Enum e)
{
var attribute =
e.GetType()
.GetTypeInfo()
.GetMember(e.ToString())
.FirstOrDefault(member => member.MemberType == MemberTypes.Field)
.GetCustomAttributes(typeof(DescriptionAttribute), false)
.SingleOrDefault()
as DescriptionAttribute;
return attribute?.Description ?? e.ToString();
}
}
So, to get the string associated with our enum above, we could use the following code:
using Your.Extension.Method.Namespace;
...
var action = ActionCode.Edit;
var actionDescription = action.GetDescription();
// Value of actionDescription will be "E".
Here is another sample Enum:
public enum TestEnum
{
[Description("This is test 1")]
Test1,
Test2,
[Description("This is test 3")]
Test3
}
Here is the code to see the description:
var test = TestEnum.Test2;
var testDescription = test.GetDescription();
test = TestEnum.Test3;
var testDescription2 = test.GetDescription();
Results will be:
testDescription: "Test2"
testDescription2: "This is test 3"
I wanted to go ahead and post the generic method as it is much more useful. It prevents you from having to write a custom extension for all of your enums.