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
看看这里:我刚刚添加了我的“链接问题”,这是一个很好的用法示例。看看这里:我刚刚添加了我的“链接问题”,这是一个很好的用法示例。