Australian Shepherd babies - Jametlene Reskp
Australian Shepherd babies - Jametlene Reskp

Display a friendly name with Enum.ToString()

2021-11-26 #csharp#enum

One day I needed to display a label based on the value of one Enum. So I did like every time and I used the Description attribute to define some nice labels.

using System.ComponentModel;

public enum NatureType
{
    Ouverture,
    Modification,
    [Description("Déblocage")]
    Deblocage,
    [Description("Alerte 3 mois")]
    Alerte3Mois,
    [Description("Alerte 6 mois")]
    Alerte6Mois
}

Then I copied the rather complicated code that we always been using to read this description attribute. It's a simple extension method, which is a generic method, and which uses some reflection. As I said, a simple block of code that return the description associated to an enum value or default to .ToString() for values without a proper Description attribute:

public static string GetCaption(this Enum value)
{
    var type = value.GetType();
    var member = type.GetMember(value.ToString());
    if ((member != null && member.Length > 0))
    {
        var attributes = member[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
        if ((attributes != null && attributes.Count() > 0))
        {
            return ((System.ComponentModel.DescriptionAttribute)attributes.ElementAt(0)).Description;
        }
    }
    return value.ToString();
}

Really nothing very complicated. Except to paste this method to the StringHelpers.cs file of my project.

But still, it doesn't cost anything to see if C# would have invented something even simpler or more practical lately. Except a Google Search "c# enum friendly name" + Tools + Past year.

Good news! There are people who worked on it. But unfortunately, nothing new:

I have a little time to spare so I try some new things:

public enum NatureType
{
    Ouverture,
    Modification,
    Déblocage,
    Alerte_3_mois,
    Alerte_6_mois
}

Ideally, I just have to code a public override string ToString() in order to replace underscores with spaces and I'm done!

But where the hell can I do that?

It doesn't matter, I should be able to try it with an extension method:

public static string ToString(this Enum value)
{
    return value.ToString().Replace("_", " ");
}

Well, no :( My code compiles without causing an error, but then it's like this method doesn't exist! I set a breakpoint but I don't even get through and I still get the basic .ToString() with underscores ???

That's not going to stop me. I could live with the underscores. Or I do it differently:

public static string ToCaption(this Enum value)
{
    return value.ToString().Replace("_", " ");
}

I had to decide with .ToFriendlyName() which seems more popular, but .ToCaption() is shorter :)

So okay, that forces me to accept having accents in variable names (well, only in enum value names). But I think I'll use this method from now on, at least in my personal projects.