枚举的 ToString 方法如何返回易于理解的字符串?

366

我的枚举包含以下值:

private enum PublishStatusses{
    NotCompleted,
    Completed,
    Error
};

我希望能以用户友好的方式输出这些值。
但我不需要再将字符串转换回值。


1
可能是C#字符串枚举的重复问题。 - nawfal
27个回答

1

只需使用一个模拟枚举的静态类:

public static class PublishStatusses{
   public const string NotCompleted = "Not Completed";
   public const string Completed = "Completed";
   public const string Error = "Error"
};

要访问这些值,只需像使用枚举一样使用:

PublishStatusses.NotCompleted;

这是一个完全不同的用例。当作为方法参数传递时,它与枚举的语义完全不同。它将是一个字符串,也是一个引用类型(因此具有不同的行为),除此之外还失去了枚举提供的类型/值强制执行和静态分析。switch语句也变得更加繁琐。微软还明确建议在设计准则中避免这样做:https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/enum 和 https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/static-class - undefined

1
如果您只想在单词之间添加一个空格,那么这非常简单。
string res = Regex.Replace(PublishStatusses.NotCompleted, "[A-Z]", " $0").Trim();

反射(隐含在枚举->字符串转换中),正则表达式和多个字符串操作都放在一起。不要这样做。这样会导致大量的垃圾由GC处理,每次调用都会产生很大的计算量。为了解决这个问题,可以在应用程序中创建一个扩展方法,其中包含一个switch语句,或者在使用枚举的类中创建一个方法或属性(如果只有一个枚举)来将其转换为用户友好的字符串。如果你想要使其具有未来的可扩展性,当然,你可以在switch语句/表达式的default子句中这样做,但我仍然不建议。 - undefined

1
2023
public static string ToEnumString<T>(this T input) where T : Enum
{
     return Enum.GetName(typeof(T),input);
}

使用方法:

public enum CommentInformType { Abuse, Misleading, Spam, BadMouth }
...
CommentInformType _informType = CommentInformType.Spam;
_informType.ToEnumString();

0

对于包含标志的枚举。

    public static string Description(this Enum value)
    {
        Type type = value.GetType();

        List<string> res = new List<string>();
        var arrValue = value.ToString().Split(',').Select(v=>v.Trim());
        foreach (string strValue in arrValue)
        {
            MemberInfo[] memberInfo = type.GetMember(strValue);
            if (memberInfo != null && memberInfo.Length > 0)
            {
                object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);

                if (attrs != null && attrs.Length > 0 && attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault() != null)
                {
                    res.Add(((DescriptionAttribute)attrs.Where(t => t.GetType() == typeof(DescriptionAttribute)).FirstOrDefault()).Description);
                }
                else
                    res.Add(strValue);
            }
            else
                res.Add(strValue);
        }

        return res.Aggregate((s,v)=>s+", "+v);
    }

-1

我使用一个通用类来存储枚举/描述对,以及一个嵌套的辅助类来获取描述。

枚举

enum Status { Success, Fail, Pending }

泛型类:

注意:由于泛型类不能受到枚举的限制,我将其限制为结构体,并在构造函数中检查枚举。

public class EnumX<T> where T : struct
{
    public T Code { get; set; }
    public string Description { get; set; }

    public EnumX(T code, string desc)
    {
        if (!typeof(T).IsEnum) throw new NotImplementedException();

        Code = code;
        Description = desc;
    }

    public class Helper
    {
        private List<EnumX<T>> codes;

        public Helper(List<EnumX<T>> codes)
        {
            this.codes = codes;
        }

        public string GetDescription(T code)
        {
            EnumX<T> e = codes.Where(c => c.Code.Equals(code)).FirstOrDefault();
            return e is null ? "Undefined" : e.Description;
        }
    }
}

使用方法:

EnumX<Status>.Helper StatusCodes = new EnumX<Status>.Helper(new List<EnumX<Status>>()
        {
            new EnumX<Status>(Status.Success,"Operation was successful"),
            new EnumX<Status>(Status.Fail,"Operation failed"),
            new EnumX<Status>(Status.Pending,"Operation not complete. Please wait...")
        });

        Console.WriteLine(StatusCodes.GetDescription(Status.Pending));

-2

我认为解决您的问题最好(也是最简单)的方法是为您的枚举编写一个扩展方法:

public static string GetUserFriendlyString(this PublishStatusses status)
    {

    }

2
有人比现在早7年就已经说过了。 - Steven

-3

3
现在该网站已经宕机了。 - Nic Foster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接