JsonConvert.SerializeObject с использованием перечисления неправильно извлекает значение атрибута EnumMember - PullRequest
1 голос
/ 12 июля 2020

Мы пытаемся получить значение из атрибута 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() дает нам "South_Carolina"

1 Ответ

1 голос
/ 12 июля 2020

Как я написал в комментарии, это правильное поведение сериализатора. Вы можете использовать отражение, чтобы получить значение 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"

Вы можете улучшить этот код хотя бы путем введения кеширования.

...