如何格式化枚举

本文关键字:枚举 格式化 | 更新日期: 2023-09-27 18:24:15

我需要我的枚举将格式化的字符串返回到视图,例如:

public enum status
{ 
   NotStarted,
   InProgress,
} 

返回:Not StartedIn Progress。我是怎么做的?感谢(C#语言)

如何格式化枚举

enum不这么做。您需要提供一个枚举值映射来显示字符串,或者您可以使用显示字符串来定义属性(这需要一些复杂的反射来获得给定枚举值的属性,但其优点是您可以在定义枚举值的地方定义显示名称)。

例如,您可以使用Dictionary<status,string>来映射它们:

var myMap = new Dictionary<status,string>()
{
    { status.NotStarted, "Not Started" },
    { status.InProgress, "In Progress" }
};

现在,要获得给定状态值s的显示字符串,只需执行以下操作:

var s = status.NotStarted;
var displayString = myMap[s];   // "Not Started"

当然,你可以把它放在一个类的某个地方,这样它只在一个地方定义一次。

另一种相当脆弱、快速和肮脏的方法是利用枚举名称是Pascal大小写的这一事实,并使用类似regex的东西来获取枚举名称并插入额外的空格。但这很烦人。所以你可以做一些类似的事情:

var r = new Regex("([A-Z][a-z]*)([A-Z][a-z]*)");
var displayString = r.Replace(s.ToString(),"$1 $2");    // "Not Started"

但这会阻塞任何不符合两个Pascal大小写单词模式的枚举值。当然,您可以使正则表达式更加灵活,但这超出了问题的范围。

在emum值上调用ToString相当于Enum.GetName,它将为您提供命名值,即

Console.WriteLine(status.NotStarted.ToString()) // NotStarted

从那里,假设格式是一致的,您可以将字符串从Pascal大小写转换为空白分隔的字符串,例如

string result = Regex.Replace(status.NotStarted, "([a-z])([A-Z])", "$1 $2");
Console.WriteLine(result); // Not Started

请参见示例。

Enum.GetName(typeof (Status), Status.InProgress));