Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.42 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Infrastructure.Enums
  4. {
  5.     /// <summary>
  6.     ///     Значение <see cref="Enum" />.
  7.     /// </summary>
  8.     public class EnumValue
  9.     {
  10.         /// <summary>
  11.         ///     Конструирует значение <see cref="Enum" />.
  12.         /// </summary>
  13.         /// <param name="id">Числовое представление значения.</param>
  14.         /// <param name="value">Строковое представление значения.</param>
  15.         /// <param name="name">Отображаемое наименование.</param>
  16.         public EnumValue(long id, string value, string name)
  17.         {
  18.             Id = id;
  19.             Value = value;
  20.             Name = name;
  21.         }
  22.  
  23.         /// <summary>
  24.         ///     Числовое представление значения.
  25.         /// </summary>
  26.         public long Id { get; }
  27.  
  28.         /// <summary>
  29.         ///     Строковое представление значения.
  30.         /// </summary>
  31.         public string Value { get; }
  32.  
  33.         /// <summary>
  34.         ///     Отображаемое наименование.
  35.         /// </summary>
  36.         public string Name { get; }
  37.     }
  38. }
  39.  
  40.  
  41. using System;
  42. using System.Collections.Generic;
  43. using System.ComponentModel.DataAnnotations;
  44. using System.Linq;
  45. using System.Reflection;
  46.  
  47. namespace Infrastructure.Enums
  48. {
  49.     /// <summary>
  50.     ///     Сервис, предоставляющий значения <see cref="Enum" />.
  51.     /// </summary>
  52.     public static class EnumValueProvider
  53.     {
  54.         /// <summary>
  55.         ///     Возвращает все возможные значения для перечисления указанного типа.
  56.         /// </summary>
  57.         /// <typeparam name="TEnum">Тип перечисления.</typeparam>
  58.         /// <returns></returns>
  59.         public static EnumValue[] GetValues<TEnum>()
  60.             // ReSharper disable All
  61.             where TEnum : Enum
  62.         // ReSharper restore All
  63.         {
  64.             var enumType = typeof(TEnum);
  65.             if (!enumType.IsEnum)
  66.                 throw new Exception("Указан недопустимый тип для данной операции.");
  67.             var result = new List<EnumValue>();
  68.             var enumValues = Enum.GetValues(enumType).Cast<TEnum>().ToArray();
  69.             foreach (var enumValue in enumValues)
  70.             {
  71.                 var id = Convert.ToInt64(enumValue);
  72.                 var value = Enum.GetName(enumType, enumValue);
  73.                 var member = enumType
  74.                     .GetMember(
  75.                         Enum.GetName(enumType, enumValue),
  76.                         BindingFlags.Public | BindingFlags.Static)
  77.                     .FirstOrDefault();
  78.                 var name = value;
  79.                 if (member != null)
  80.                 {
  81.                     var memberAttributes = member.GetCustomAttributes();
  82.                     foreach (var memberAttribute in memberAttributes)
  83.                         if (memberAttribute is DisplayAttribute displayAttribute)
  84.                             if (!string.IsNullOrEmpty(displayAttribute.Name))
  85.                             {
  86.                                 name = displayAttribute.Name;
  87.                                 break;
  88.                             }
  89.                 }
  90.  
  91.                 result.Add(new EnumValue(id, value, name));
  92.             }
  93.  
  94.             var resultArray = result.OrderBy(x => x.Id).ToArray();
  95.             return resultArray;
  96.         }
  97.  
  98.         /// <summary>
  99.         ///     Возвращает значение для перечисления указанного типа.
  100.         /// </summary>
  101.         /// <typeparam name="TEnum">Тип перечисления.</typeparam>
  102.         /// <param name="enumValue">Значение перечисления.</param>
  103.         /// <returns></returns>
  104.         public static EnumValue GetValue<TEnum>(TEnum enumValue)
  105.             // ReSharper disable All
  106.             where TEnum : Enum
  107.         // ReSharper restore All
  108.         {
  109.             var enumType = enumValue.GetType();
  110.             if (!enumType.IsEnum)
  111.                 throw new Exception("Указан недопустимый тип для данной операции.");
  112.             if (!Enum.IsDefined(enumType, enumValue))
  113.                 throw new Exception("Указанное значение не входит в диапазон перечисления");
  114.             var id = Convert.ToInt64(enumValue);
  115.             var value = Enum.GetName(enumType, enumValue);
  116.             var member = enumType
  117.                 .GetMember(
  118.                     Enum.GetName(enumType, enumValue),
  119.                     BindingFlags.Public | BindingFlags.Static)
  120.                 .FirstOrDefault();
  121.             var name = value;
  122.             if (member != null)
  123.             {
  124.                 var memberAttributes = member.GetCustomAttributes();
  125.                 foreach (var memberAttribute in memberAttributes)
  126.                     if (memberAttribute is DisplayAttribute displayAttribute)
  127.                         if (!string.IsNullOrEmpty(displayAttribute.Name))
  128.                         {
  129.                             name = displayAttribute.Name;
  130.                             break;
  131.                         }
  132.             }
  133.  
  134.             var result = new EnumValue(id, value, name);
  135.             return result;
  136.         }
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement