这个问题是相关的,但是恕我直言并不相同
在进行测试时,我还偶然发现了这个罪魁祸首的LinqPad,这使我的生活变得困难: Why does LINQPad dump enum integer values as strings?
现在,我的实际问题是: 我的应用程序(特别是SyncFusion组件数据源,例如MultiSelect)需要JSON格式的枚举,例如像这样的东西:
[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]
更新
正如dbc指出的那样,我的问题可能还不够清楚。我不想序列化枚举的一个条目,而是整个结构。然后可以将JSON用于Javascript中的数据源,例如对于,简化为:
<option value=0>Unknown</option>
<option value=1>Open</option> etc
JSON对象与名称空间中的Enum相同(但我为每个条目的Key和Value赋予了一个属性名称:
public enum ListOptions
{
Unknown = 0,
Open = 1,
Closed = 2,
Approve = 3
}
我一直在努力使用Enums,其他所有方法(例如指定Json StringConverter等)都无法在数组中产生 all 选项,因此我最终使用了Linq。我的视图模型现在具有这样的字符串属性:
public string CrewListOption => JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions))
.Cast<int>()
.Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }));
鉴于我几乎是ASP.Net Core的初学者,所以我很难相信这应该是一个好的解决方案。但是,我发现很难找到同一件事的直接更好的例子。
如果您能够帮助我改善这一点,并使其对于将整个枚举“导出”到JSON而言可能更具通用性,我将不胜感激。
这是完整的LinqPad(Newtonsoft.Json从GAC导入的地方):
void Main()
{
Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = e, Name = (ListOptions) e } ).Dump(); // these are identical, except for the typeof()
Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }).Dump(); // is typeof(MyEnumType) better?
string JsonString = JsonConvert.SerializeObject(Enum.GetValues(typeof(ListOptions)).Cast<int>().Select(e => new { Id = (int) e, Name = typeof(ListOptions).GetEnumName(e) }));
JsonString.Dump(); // [{"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"}]
}
public enum ListOptions {
Unknown = 0,
Open = 1,
Closed = 2,
Approve = 3
};
答案 0 :(得分:1)
您可能有静态方法,例如
public static EnumToDictionary<string, string> EnumToDictionary<T>() where T: Enum
{
var res = Enum.GetValues(typeof(T)).Cast<T>()
.ToDictionary(e => Convert.ToInt32(e).ToString(), e => e.ToString());
return res;
}
然后将其序列化为对象
var enumValues= EnumToDictionary<ListOptions>();
var result = JsonConvert.SerializeObject(enumValues);
用于序列化为数组
var enumValues= EnumToDictionary<ListOptions>().ToArray();
var result = JsonConvert.SerializeObject(enumValues);
答案 1 :(得分:1)
这是来自Microsoft Docs的示例,该示例将Enum转换为Dictionary
然后您可以将字典序列化为JSON。