Этот вопрос связан, но ИМХО не идентичен
Во время тестирования я также наткнулся на этого преступника LinqPad, который осложнил мою жизнь:
Почему LINQPad выводит целочисленные значения enum в виде строк?
Теперь мой актуальный вопрос:
Мое приложение (в частности источники данных компонентов SyncFusion, такие как MultiSelect) требует перечисления в формате JSON, например, как то так:
[ {"Id":0,"Name":"Unknown"},{"Id":1,"Name":"Open"},{"Id":2,"Name":"Closed"},{"Id":3,"Name":"Approve"} ]
UPDATE
Как указал dbc, мой вопрос мог быть недостаточно ясным. Я не хочу сериализовать одну запись перечисления, но всю структуру. Затем JSON можно использовать для источника данных в Javascript, например, для упрощенного:
<option value=0>Unknown</option>
<option value=1>Open</option> etc
Объект JSON идентичен Enum в пространстве имен (за исключением того, что я дал имя свойства ключу и значению каждой записи:
public enum ListOptions
{
Unknown = 0,
Open = 1,
Closed = 2,
Approve = 3
}
Я боролся с Enums, все другие подходы, такие как указание Json StringConverter и т. Д., Не дали всех опций в массиве, поэтому я в конечном итоге использовал 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
};