C# 如何格式化枚举?

C# 如何格式化枚举?,c#,model-view-controller,enums,C#,Model View Controller,Enums,我需要我的枚举将格式化字符串返回到视图,例如: public enum status { NotStarted, InProgress, } 返回:未启动和正在进行。我怎么做?谢谢(C语言)枚举不能这样做。您需要提供枚举值的映射以显示字符串,或者您可以使用显示字符串定义属性(这需要一些精细的反射来获取给定枚举值的属性,但其优点是您可以在定义枚举值的位置定义显示名称) 例如,您可以使用字典来映射它们: var myMap = new Dictionary<status,st

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

public enum status
{ 
   NotStarted,
   InProgress,
} 

返回:
未启动
正在进行
。我怎么做?谢谢(C语言)

枚举不能这样做。您需要提供枚举值的映射以显示字符串,或者您可以使用显示字符串定义属性(这需要一些精细的反射来获取给定枚举值的属性,但其优点是您可以在定义枚举值的位置定义显示名称)

例如,您可以使用
字典
来映射它们:

var myMap = new Dictionary<status,string>()
{
    { status.NotStarted, "Not Started" },
    { status.InProgress, "In Progress" }
};
当然,你会把它放在一个类的某个地方,所以它只能在一个地方定义一次

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

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

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

枚举不能做到这一点。您需要提供枚举值的映射以显示字符串,或者您可以使用显示字符串定义属性(这需要一些精细的反射来获取给定枚举值的属性,但其优点是您可以在定义枚举值的位置定义显示名称)

例如,您可以使用
字典
来映射它们:

var myMap = new Dictionary<status,string>()
{
    { status.NotStarted, "Not Started" },
    { status.InProgress, "In Progress" }
};
当然,你会把它放在一个类的某个地方,所以它只能在一个地方定义一次

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

var s = status.NotStarted;
var displayString = myMap[s];   // "Not Started"
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
与将为您提供命名值的值等效,即

Console.WriteLine(status.NotStarted.ToString()) // NotStarted
在此基础上,假设格式一致,您可以将Pascal大小写中的字符串转换为以空格分隔的字符串,例如

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

在emum值上调用
ToString
相当于为您提供命名值,即

Console.WriteLine(status.NotStarted.ToString()) // NotStarted
在此基础上,假设格式一致,您可以将Pascal大小写中的字符串转换为以空格分隔的字符串,例如

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

看看这里:我刚刚添加了我的“链接问题”,这是一个很好的用法示例。看看这里:我刚刚添加了我的“链接问题”,这是一个很好的用法示例。