如何格式化枚举
本文关键字:枚举 格式化 | 更新日期: 2023-09-27 18:24:15
我需要我的枚举将格式化的字符串返回到视图,例如:
public enum status
{
NotStarted,
InProgress,
}
返回:Not Started
和In 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));