Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // <summary>
- /// Значение <see cref="Enum" />.
- /// </summary>
- public class EnumValue
- {
- /// <summary>
- /// Конструирует значение <see cref="Enum" />.
- /// </summary>
- /// <param name="id">Числовое представление значения.</param>
- /// <param name="value">Строковое представление значения.</param>
- /// <param name="name">Отображаемое наименование.</param>
- public EnumValue(long id, string value, string name)
- {
- Id = id;
- Value = value;
- Name = name;
- }
- /// <summary>
- /// Числовое представление значения.
- /// </summary>
- public long Id { get; }
- /// <summary>
- /// Строковое представление значения.
- /// </summary>
- public string Value { get; }
- /// <summary>
- /// Отображаемое наименование.
- /// </summary>
- public string Name { get; }
- }
- /// <summary>
- /// Сервис, предоставляющий значения <see cref="Enum" />.
- /// </summary>
- public class EnumValueProvider
- {
- /// <summary>
- /// Возвращает все возможные значения для перечисления указанного типа.
- /// </summary>
- /// <typeparam name="TEnum">Тип перечисления.</typeparam>
- /// <returns></returns>
- public EnumValue[] GetValues<TEnum>()
- where TEnum : struct, IFormattable, IComparable, IConvertible
- {
- var enumType = typeof(TEnum);
- if (!enumType.IsEnum)
- throw new Exception("Указан недопустимый тип для данной операции.");
- var result = new List<EnumValue>();
- var enumValues = Enum.GetValues(enumType).Cast<TEnum>().ToArray();
- foreach (var enumValue in enumValues)
- {
- var id = Convert.ToInt64(enumValue);
- var value = Enum.GetName(enumType, enumValue);
- var member = enumType
- .GetMember(
- enumValue.ToString(CultureInfo.InvariantCulture),
- BindingFlags.Public | BindingFlags.Static)
- ?.FirstOrDefault();
- var name = value;
- if (member != null)
- {
- var memberAttributes = member.GetCustomAttributes();
- foreach (var memberAttribute in memberAttributes)
- if (memberAttribute is DisplayAttribute displayAttribute)
- if (!string.IsNullOrEmpty(displayAttribute.Name))
- {
- name = displayAttribute.Name;
- break;
- }
- }
- result.Add(new EnumValue(id, value, name));
- }
- var resultArray = result.OrderBy(x => x.Id).ToArray();
- return resultArray;
- }
- /// <summary>
- /// Возвращает значение для перечисления указанного типа.
- /// </summary>
- /// <typeparam name="TEnum">Тип перечисления.</typeparam>
- /// <param name="enumValue">Значение перечисления.</param>
- /// <returns></returns>
- public EnumValue GetValue<TEnum>(TEnum enumValue)
- where TEnum : struct, IFormattable, IComparable, IConvertible
- {
- var enumType = typeof(TEnum);
- if (!enumType.IsEnum)
- throw new Exception("Указан недопустимый тип для данной операции.");
- if (!Enum.IsDefined(enumType, enumValue))
- throw new Exception("Указанное значение не входит в диапазон перечисления");
- var id = Convert.ToInt64(enumValue);
- var value = Enum.GetName(enumType, enumValue);
- var member = enumType
- .GetMember(
- enumValue.ToString(CultureInfo.InvariantCulture),
- BindingFlags.Public | BindingFlags.Static)
- ?.FirstOrDefault();
- var name = value;
- if (member != null)
- {
- var memberAttributes = member.GetCustomAttributes();
- foreach (var memberAttribute in memberAttributes)
- if (memberAttribute is DisplayAttribute displayAttribute)
- if (!string.IsNullOrEmpty(displayAttribute.Name))
- {
- name = displayAttribute.Name;
- break;
- }
- }
- var result = new EnumValue(id, value, name);
- return result;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement