Как изменить .ToString() в Enum

Есть Enum

   public enum ExerciseCategorysEnum
    {
        None,        
        Like_and_comment,
        Subscribe,
        Register,
        Donate,
    }    

В нём есть Like_and_comment, но мне надо что бы при обращении к ней .ToString() выдавалось Like and comment, Я знаю что могу использовать просто после .ToString() .Replace("_", " "), но это долго и не очень практично, а как оверрайтнуть ToString в Enum`e я не знаю, по этому и прошу помощи


Ответы (2 шт):

Автор решения: zomgra

Решил тем, что взял метод с https://stackoverflow.com/a/479453, и переделал под себя

public static class ToStringExercise
    {
        public static string ToFriendlyString(this ExerciseCategorysEnum me)
        {
            return me.ToString().Replace("_", "");
        }
    }
→ Ссылка
Автор решения: aepot

В перечисления не хардкодят данные, а у вас это именно данные. В перечисления хардкодят то, что никогда не поменяется. Это делается для того чтобы не пришлось переписывать код в случае внесения изменений в данные.

Поэтому лучше изначально начинать использовать рантайм-структуры данных вместо перечислений.

Dictionary<string, string> items = new Dictionary<string, string>
{
    ["None"] = "None",        
    ["LikeAndComment"] = "Like and comment",
    ["Subscribe"] = "Subscribe",
    ["Register"] = "Register",
    ["Donate"] = "Donate"
};

Преимущество словаря в том, что вам необязательно хранить его в коде, его можно загрузить например из JSON или базы данных, его можно редактировать прямо в рантайме. При этом не придется пересобирать и релизить новую версию програмного комплекса.

Console.WriteLine(items["LikeAndComment"]);
Like and comment

Так же здесь появляется возможность использовать разные языки, например вы сможете загрузить в словарь строки на русском языке, в зависимости от предпочтений пользователя.

Если словарь кажется сложным, а в качестве индексов хочется использовать числа, можно использовать вообще список или массив.

string[] items = new string[]
{
    "None",        
    "Like and comment",
    "Subscribe",
    "Register",
    "Donate"
};
Console.WriteLine(items[1]);
Like and comment

Список так же легко сериализуется и хранится во внешних данных.

Что касается прикручивания кастомных строк к перечислениям, то делается это через атрибуты.

public enum ExerciseCategorysEnum
{
    None,
    [EnumMember(Value = "Like and comment")]
    Like_and_comment,
    Subscribe,
    Register,
    Donate,
}

public static class EnumMemberExtensions
{
    public static string GetName<T>(this T member) where T : Enum
    {
        string name = member.ToString();
        return typeof(T).GetField(name)?
            .GetCustomAttribute<EnumMemberAttribute>()?.Value ?? name;
    }
}
Console.WriteLine(ExerciseCategorysEnum.Like_and_comment.GetName());
Like and comment
→ Ссылка