Files
YandexMusic/YandexMusic.API/Extensions/EnumHelper.cs
FrigaT 8c5dca1491
All checks were successful
Release / pack-and-publish (release) Successful in 32s
Добавлен парсинг EnumMember
2026-04-23 17:16:18 +03:00

49 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Concurrent;
using System.Reflection;
using System.Runtime.Serialization;
namespace YandexMusic.API.Extensions;
public static class EnumHelper
{
private static readonly ConcurrentDictionary<Type, Dictionary<string, object>> _enumMaps = new();
/// <summary>
/// Пытается преобразовать строковое значение в enum с учётом атрибутов [EnumMember].
/// </summary>
/// <typeparam name="T">Тип enum</typeparam>
/// <param name="memberValue">Строковое значение из JSON или другого источника</param>
/// <param name="ignoreCase">Учитывать регистр (по умолчанию true)</param>
/// <param name="result">Результат преобразования, если успешно, иначе default</param>
/// <returns>true если преобразование удалось, иначе false</returns>
public static bool TryEnumFromMemberValue<T>(string memberValue, bool ignoreCase, out T result) where T : struct, Enum
{
result = default;
if (string.IsNullOrEmpty(memberValue))
return false;
var type = typeof(T);
// Получаем или создаём кэш для данного enum
var map = _enumMaps.GetOrAdd(type, t =>
{
var dict = new Dictionary<string, object>(ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal);
foreach (var field in t.GetFields(BindingFlags.Static | BindingFlags.Public))
{
var attr = field.GetCustomAttribute<EnumMemberAttribute>();
var key = attr?.Value ?? field.Name;
dict[key] = field.GetValue(null)!;
}
return dict;
});
// Ищем по кэшу
if (map.TryGetValue(memberValue, out var value))
{
result = (T)value;
return true;
}
// fallback на обычный Enum.TryParse (без учёта EnumMember)
return Enum.TryParse(memberValue, ignoreCase, out result);
}
}