我的枚举由以下值组成:

private enum PublishStatusses{
    NotCompleted,
    Completed,
    Error
};

我希望能够以用户友好的方式输出这些值。 我不需要再从字符串到值。


当前回答

我用扩展方法做到这一点:

public enum ErrorLevel
{
  None,
  Low,
  High,
  SoylentGreen
}

public static class ErrorLevelExtensions
{
  public static string ToFriendlyString(this ErrorLevel me)
  {
    switch(me)
    {
      case ErrorLevel.None:
        return "Everything is OK";
      case ErrorLevel.Low:
        return "SNAFU, if you know what I mean.";
      case ErrorLevel.High:
        return "Reaching TARFU levels";
      case ErrorLevel.SoylentGreen:
        return "ITS PEOPLE!!!!";
      default:
        return "Get your damn dirty hands off me you FILTHY APE!";
    }
  }
}

其他回答

这里最简单的解决方案是使用自定义扩展方法(至少在。net 3.5中-您可以将其转换为早期框架版本的静态帮助器方法)。

public static string ToCustomString(this PublishStatusses value)
{
    switch(value)
    {
        // Return string depending on value.
    }
    return null;
}

我在这里假设您希望返回enum值的实际名称以外的内容(您可以通过简单地调用ToString来获得)。

我已经迟到7年了:-)但我相信这个话题经常被访问。所以我想在咖啡里加一点糖:

那么“F”格式字符串说明符呢?

PublishStatusses[] ps = Enum.GetValues<PublishStatusses>();
ps.ToList().ForEach(c => Console.Write($"{c:F} "));

不需要任何显式的函数调用。

事实上,甚至不需要任何格式说明符。 在将变量赋值给字符串的情况下,ToString()执行以下工作:

string foo = PublishStatusses.Error.ToString(); // or ToString("F")

如果它要在CamelCase字符串的单词之间插入空格,你可以使用正则表达式:

Regex.Replace(foo, "(\\B[A-Z])", " $1")

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

public static string GetUserFriendlyString(this PublishStatusses status)
    {

    }

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

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

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

PublishStatusses.NotCompleted;

我使用一个泛型类来存储枚举/描述对,并使用一个嵌套的helper类来获取描述。

枚举:

enum Status { Success, Fail, Pending }

泛型类:

注意:由于泛型类不能被枚举约束,我用struct来代替约束,并在构造函数中检查enum。

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));