C# 将字典枚举键呈现为命名值

C# 将字典枚举键呈现为命名值,c#,asp.net-mvc-5.1,C#,Asp.net Mvc 5.1,我有一个枚举,看起来像这样: public Enum MyEnum{EnumA=0,EnumB=10,EnumC=20} 我还有一个字典模型,我希望在Razor视图中使用它,我希望将字典的键分配给javascript数组,如下所示: var myArray=@Html.Raw(Json.Encode(Model.Keys.ToArray()) 这将导致myArray=[0,10,20],这与我想要的非常接近。我希望添加枚举的“文本”值而不是数字值,如下所示:myArray=[“EnumA”、“

我有一个枚举,看起来像这样:

public Enum MyEnum{EnumA=0,EnumB=10,EnumC=20}

我还有一个字典模型,我希望在Razor视图中使用它,我希望将字典的键分配给javascript数组,如下所示:

var myArray=@Html.Raw(Json.Encode(Model.Keys.ToArray())

这将导致
myArray=[0,10,20]
,这与我想要的非常接近。我希望添加枚举的“文本”值而不是数字值,如下所示:
myArray=[“EnumA”、“EnumB”、“EnumC”]

显示单个枚举字段时,
@Html.DisplayFor
可用于将数值转换为枚举“文本”值

有没有一种方法可以让我的密钥以相同的方式转换,而不必通过它们循环并手动将它们添加到数组中?

您可以尝试以下方法:

var values = Model.Keys.ToArray().Select(val => val.ToString());
var myArray = @Html.Raw(Json.Encode(values));
var values = Model.Keys.ToArray().Select(val => ((MyEnum)val).ToString());
var myArray = @Html.Raw(Json.Encode(values));
如果键的类型仍然是
MyEnum
,则它们应自动表示为枚举值的名称

如果不起作用,您也可以尝试以下方法:

var values = Model.Keys.ToArray().Select(val => val.ToString());
var myArray = @Html.Raw(Json.Encode(values));
var values = Model.Keys.ToArray().Select(val => ((MyEnum)val).ToString());
var myArray = @Html.Raw(Json.Encode(values));
这假设如果您的键不是MyEnum类型,那么它们至少是整数


请注意,如果键中的值与定义的
MyEnum
值不对应(例如,如果定义了值1-4且键为17),则仍然会将键值作为数字字符串获取。

可以使用
Enum.Parse

var array = new List<int> {0, 10, 20};
var arrayEnum = array.Select(x => Enum.Parse(typeof(MyEnum), x.ToString())).ToList();
var数组=新列表{0,10,20};
var arrayEnum=array.Select(x=>Enum.Parse(typeof(MyEnum),x.ToString()).ToList();

不错!从未想过像这样使用select。Razor抱怨
在上下文中不存在。我把所有的东西都放在一行中,效果很好,但是两行的版本更可读。你知道为什么它不能识别上面这一行定义的值吗?恐怕我不知道,而且我目前没有在VS中工作(在这台机器上也没有),所以我无法进行实验并尝试找出答案。很抱歉顺便说一句,我在发布后意识到,您可能可以取出第一行中的
.ToArray()
。虽然我无法验证这一点,但我相信
Model.Keys
已经是LINQ可以使用的类型了。这也是一个很好的解决方案!这是一个很好的解决方案,但您也可以直接将整数强制转换为枚举,如
(MyEnum)x
中所示。您不必生成字符串,然后解析字符串。可能转换比解析快。