0

Having a custom EnumConverter that should return the default enum isn't working as I expect.

Enum :

public enum MyEnum
{
    Unknonw = 0,
    FirstEnum = 1,
    SecondEnum = 2
}

The converter :

public override ContractType Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
    switch (reader.TokenType)
    {
        case JsonTokenType.String:
        {
            var value = reader.GetString();

            if (Enum.TryParse(typeToConvert, value, out var result))
            {
                return (MyEnum)result;
            }

            return MyEnum.Unknown;
        }
        case JsonTokenType.Number:
        {
            var value = reader.GetInt32();

            MyEnum myEnum = (MyEnum)value;

            if (Enum.TryParse(typeToConvert, myEnum.ToString(), out var result))
            {
                return (MyEnum)result;
            }

            return MyEnum.Unknown;
        }
            default:
                return MyEnum.Unknown;
        }
    }
}

If I use this for example in my JSON resuest :

{
    "myType": 7
}

It doesn't return MyEnym.Unknown, why is that? What am I missing?

If I use this for example in my JSON request :

{
    "myType": "Random"
}

It return's MyEnum.Unknown.

And if I use this for example :

{
    "myType": 1
}

It return's MyEnum.FirstEnum. So this part.

dbc
  • 104,963
  • 20
  • 228
  • 340
user7849697
  • 503
  • 1
  • 8
  • 19
  • 3
    If you just want to check if the number corresponds to a defined enum constant, use `if (Enum.IsDefined(myEnum))`. – Sweeper May 09 '22 at 13:59
  • Hint: `TryParse` does not fail if it's given a string value representing a number even if that number is not explicitly defined in the enum (e.g. `TryParse(typeof(MyEnum), "7", our var result)`. – D Stanley May 09 '22 at 14:06
  • Note that not all enums are use `Int32` as underlying type. Some can use `Int64` or `UInt64`. Also, Enum.IsDefined() may not do what you want for `[Flags]` enums, see [C#: Enum.IsDefined on combined flags](https://stackoverflow.com/q/527486). You might try to customize the converter from [System.Text.Json: How do I specify a custom name for an enum value?](https://stackoverflow.com/a/59061296/3744182) to meet your needs. – dbc May 09 '22 at 14:10

0 Answers0