Member 8989123 Ответов: 2

Есть ли способ сопоставить несколько строк с одним и тем же значением перечисления при десериализации?


Привет. Мне нужно десериализовать json с различными цветовыми оттенками в основные цветовые перечисления -
Например, алый и малиновый перечисляют Красный (0), а бирюзовый и лаймовый - зеленый (1), но не могут понять, как и возможно ли это.

Код может выглядеть примерно так:

using System.Runtime.Serialization;
public enum PrimaryColour
{
     [EnumMember(Value = "Scarlet"), EnumMember(Value = "Crimson")]
     Red = 0,

     [EnumMember(Value = "Teal"), [EnumMember(Value = "lime")]]
     Green=1
}


Есть предложения?

Спасибо

Энди

Что я уже пробовал:

Я пробовал различные варианты перечисления примеров, но все они были недействительны.

2 Ответов

Рейтинг:
1

phil.o

Согласно с Класс EnumMemberAttribute[^], этот атрибут определяется как:

[AttributeUsage(AttributeTargets.Field, AllowMultiple=false, Inherited=false)]
public sealed class EnumMemberAttribute : Attribute
Это означает, что вы не можете сопоставить несколько имен с одним и тем же значением перечисления.
Что вы можете сделать, так это предоставить метод, который вернет a PrimaryColour значение из строки:
public static PrimaryColour GetColour(string value)
{
   switch (value.ToLowerInvariant())
   {
      case "crimson":
      case "scarlet":
         return PrimaryColour.Red;
      case "teal":
      case "lime":
         return PrimaryColour.Green;
      default:
         return PrimaryColour.Black;
   }
}

Затем, во время процесса десериализации, зацепите его, чтобы присвоить правильное значение из json (эта часть зависит от способа обработки десериализации json, о котором я на данный момент ничего не знаю).

Надеюсь, это поможет.


Рейтинг:
0

Member 8989123

Спасибо за помощь, Фил. Я вижу, к чему вы клоните, но мне неясно, как реализовать этот контекст чтения файла (html get).
Возьмем следующий пример .Это прекрасно работает для малиновых автомобилей, но мне также нужны Алые автомобили, чтобы десериализоваться как красные. Мысли?

using System;
using System.IO;
using System.Runtime.Serialization;
using Newtonsoft.Json;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            DeserializeObject();
        }

        class CarModel
        {
            public ColourEnum colour;
        }

        enum ColourEnum
        {
            //[EnumMember(Value = "Scarlet")]
            [EnumMember(Value = "Crimson")]
            Red,
            //[EnumMember(Value = "Lime")]
            [EnumMember(Value = "Teal")]
            Green,
        }

        static void DeserializeObject()
        {
            using (Stream reader = new FileStream("c://tmp//test.json", FileMode.Open))
            {
                using (var sr = new StreamReader(reader))
                {

                    using (var jr = new JsonTextReader(sr))
                    {
                        var serializer = new JsonSerializer();
                        CarModel car = serializer.Deserialize<CarModel>(jr);

                        Console.Write(car.colour);
                    }
                }
            }
        }
    }

    /*
    c://tmp//test.json = 

    {
    "colour" : "Crimson"
    }

    */
}