Как запретить невалидные значения enum?

Задумался вдруг о вопросе как десериализуется default(int) для enum'ов и обнаружил неприятное для себя поведение: Json.Net по умолчанию спокойно конвертирует и не падает с ошибкой.

Простой пример:

var data = "{ 'Sex': 0 }";

var result = JsonConvert.DeserializeObject<Person>(data);
result.Dump();

Где класс и перечисление:

public class Person
{
    //[JsonConverter(typeof(StringEnumConverter))]
    public Sex Sex { get; set; }
}

public enum Sex
{
    Male = 1,
    Female = 2,
}

Никакого исключения не падает, на выходе:

введите сюда описание изображения

Как поменять это поведение, чтобы Json.Net валидировал значения и падал?

Пока просто подавил проблему, у меня в проекте подключен FluentValidation и добавил проверку на уровне уже после десериализации:

public class CommandValidator : AbstractValidator<Command>
{
    public CommandValidator()
    {
        RuleFor(x => x.Person.Sex).IsInEnum();
    }
}

Но я что-то не уверен, что я буду постоянно пользоваться этой библиотекой, хочу обойтись только Json.Net


Ответы (2 шт):

Автор решения: Bulson

Наверное, можно так

public class Person
{
    [JsonIgnore]
    public Sex Sex { get; set; }

    [JsonProperty("Sex")]
    public string SexString
    {
        get => Sex.ToString();
        set
        {
            var sex = (Sex)Enum.Parse(typeof(Sex), value);
            if (sex <= 0 || (int)sex > 2)
            {
                throw new Exception("Ошибка в значении, ааа!");
            }
            Sex = sex;
        }
    }

}
→ Ссылка
Автор решения: A K

Решил, что зря перемудрил с Int'ами и по совету @tym32167 вернулся к строкам:

void Main()
{
    var data = "{ 'Sex': 'Male' }";

    var result = JsonConvert.DeserializeObject<Person>(data);
    result.Dump();
}

// Define other methods and classes here

public class Person
{
    [JsonConverter(typeof(StringEnumConverter))]
    public Sex Sex { get; set; }
}

public enum Sex
{
    Male = 1,
    Female = 2,
}
→ Ссылка