用有意义的东西替换枚举值

时间:2013-07-25 18:08:45

标签: c# asp.net-mvc asp.net-mvc-4

我有一个枚举,我在我的应用程序中使用如下:

  public enum TaskStatus{
       WaitinForApproval,
       SubmittedForReview,
       .....
  }

当我在页面上显示时显示:

SubmittedForReview

我想将其显示为

Submitted For Review

如何在没有太多麻烦的情况下完成这项工作?

5 个答案:

答案 0 :(得分:1)

创建一些HTML Helper并随时调用

public static string ShowMyEnumTitle(this HtmlHelper helper, myEnum enumTitle)
        {
            string enumText = "";
            string result = "";
            enumText = String.Format("{0}", Enum.GetName(typeof(myEnum), enumTitle));
            for (int i = 0; i < enumText.Length; i++)
            {
                if ((int)enumText[i] >= 65 && (int)enumText[i] <= 90 && i != 0)
                {
                    result += " " + enumText[i];
                }
                else
                {
                    result += enumText[i];
                }
            }
            return result;
        }

这个帮助器基于大写字符分隔文本,因此“SubmittedForReview”中的文本将转换为“Submitted For Review”,然后您可以在视图中调用此html帮助器:

@Html.ShowMyEnumTitle(Model.myEnumMember)

答案 1 :(得分:0)

这不是一种方式,但应该可行。

您可以制作Dictionary<TaskStatus, string>,并使用您想要显示的内容填充值。

然后,在显示值之前,只需使用字典查找要显示的值。

Dictionary<TaskStatus, string> myDictionary = new Dictionary<TaskStatus, string>();
myDictionary.Add(TaskStatus.WaitinForApproval, "Waiting For Approval");

string displayValue = myDictionary[TaskStatus.WaitinForApproval]; //Waiting For Approval

如果您更改枚举,则必须更新此内容。

答案 2 :(得分:0)

您可以使用数据注释。

using System.ComponentModel.DataAnnotations;

public enum TaskStatus{
   [Display(Name = "Waiting for approval")]
   WaitinForApproval,
   [Display(Name = "Submitted for review")]
   SubmittedForReview,
   .....
  }

这在您希望使用友好名称而不是成员实际名称的程序中的任何位置都很有用。在创建using语句之前,请确保在项目中引用System.ComponentModel.DataAnnotations。

修改

如果您使用Description属性,则对于其他人的答案,您需要使用反射访问它。使用display属性会自动在UI中显示所需的字符串。

答案 3 :(得分:-1)

您可以使用属性为每个枚举项目分配字符串 例如:

public enum TaskStatus{
   [Description("Waiting for Approval!!")]
   WaitinForApproval,
   [Description("Submmited For Review.")]
   SubmittedForReview,
   [Description("... w/e")]
   .....
}

然后使用反射访问它:

public static string GetEnumDescription(Enum value) {
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes = 
        (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

    if (attributes != null && attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
}


用法:

GetEnumDescription(TaskStatus.SubmittedForReview);

来源:http://blog.spontaneouspublicity.com/associating-strings-with-enums-in-c

答案 4 :(得分:-1)

如果您总是希望大写字母代表分词符号,则可以使用简单的正则表达式替换来添加空格。

    private static string EnumToString(TaskStatus status)
    {
        return Regex.Replace(status.ToString("F"), "(?<=\\w)([A-Z])", " $1");
    }

此表达式匹配任何前面带有任何字母的大写字母(lookbehind是这样您不会在开头添加空格)。如果你想要的话,你可以很容易地将它作为扩展。

 Console.WriteLine( EnumToString( TaskStatus.SubmittedForReview ) ); // "Submitted For Review"

我认为这种方法优于反射和属性,因为当/如果添加更多枚举值时,它也不需要任何额外的工作。缺点是输出值与枚举值直接相关,并且不能更复杂或包含标点符号。