Как изменить .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 шт):
Решил тем, что взял метод с https://stackoverflow.com/a/479453, и переделал под себя
public static class ToStringExercise
{
public static string ToFriendlyString(this ExerciseCategorysEnum me)
{
return me.ToString().Replace("_", "");
}
}
В перечисления не хардкодят данные, а у вас это именно данные. В перечисления хардкодят то, что никогда не поменяется. Это делается для того чтобы не пришлось переписывать код в случае внесения изменений в данные.
Поэтому лучше изначально начинать использовать рантайм-структуры данных вместо перечислений.
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