Мы пытаемся получить значение из атрибута EnumMember, примененного к Enum. Используя приведенный ниже код, мы получаем "\"South Carolina\"", но нам нужна "Южная Каролина":

JsonConvert.SerializeObject(dto.State, new StringEnumConverter());

Это перечисление:

public enum State
{
    [EnumMember(Value = "South Carolina")] 
    South_Carolina
}

Мы попробовали без StringEnumConverter, как показано ниже, и получили число 0:

JsonConvert.SerializeObject(dto.State);

Использование .ToString() дает нам "Южную_Каролину"

1
user33276346 12 Июл 2020 в 00:56

1 ответ

Лучший ответ

Как я написал в комментарии, это правильное поведение сериализатора. Вы можете использовать отражение, чтобы получить значение EnumMemberAttribute. Например так:

public string? GetEnumMemberAttributeValue<T>(T enumVal) where T: System.Enum
{
    var mi = typeof(T).GetMember(enumVal.ToString()).First();
    var attr = mi.GetCustomAttributes().OfType<EnumMemberAttribute>().FirstOrDefault();
    return attr != null ? attr.Value : null ;
}

Console.WriteLine(GetEnumMemberAttributeValue(State.South_Carolina)); // prints "South Carolina"

Можно улучшить этот код хотя бы за счет кеширования.

1
Guru Stron 11 Июл 2020 в 22:17