-
Notifications
You must be signed in to change notification settings - Fork 0
/
EnumerationExtensions.cs
109 lines (98 loc) · 3.77 KB
/
EnumerationExtensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
/// <summary>
/// Enum extensions
/// </summary>
public static class EnumerationExtensions
{
static object? GetAttribute(Type enumType, Type attributeType, string? value) =>
value is null || !enumType.IsEnum
? null
: enumType
.GetMember(value)
.SelectMany(p => p.GetCustomAttributes(attributeType, true))
.FirstOrDefault();
static TAttr? GetAttribute<TEnum, TAttr>(this TEnum value)
where TEnum : Enum
where TAttr : Attribute =>
GetAttribute(value.GetType(), typeof(TAttr), value.ToString()) as TAttr;
/// <summary>
/// Get description from EnumMember.Value Attribute
/// </summary>
public static string? GetEnumMemberValue(object @enum) =>
GetAttribute(@enum.GetType(), typeof(EnumMemberAttribute), @enum.ToString()) is
EnumMemberAttribute
{
Value: { } description,
}
? description
: @enum.ToString();
/// <summary>
/// Get enum description from EnumMember.Value Attribute
/// </summary>
/// <param name="enum"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static string GetEnumMemberValue<T>(this T @enum) where T : Enum =>
@enum
.GetAttribute<T, EnumMemberAttribute>() is { Value: { } description }
? description
: @enum.ToString();
/// <summary>
/// Get enum description from DescriptionAttribute
/// </summary>
/// <param name="enum"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static string GetDescription<T>(this T @enum) where T : Enum => @enum
.GetAttribute<T, DescriptionAttribute>() is { Description: { } description }
? description
: @enum.ToString();
/// <summary>
/// Get description from DescriptionAttribute
/// </summary>
public static string? GetDescription(object @enum) =>
GetAttribute(@enum.GetType(), typeof(DescriptionAttribute), @enum.ToString()) is
DescriptionAttribute
{
Description: { } description,
}
? description
: @enum.ToString();
static TEnum? GetEnumByString<TEnum>(
string enumDescription,
Func<TEnum, string> getString,
StringComparison comparison = StringComparison.Ordinal)
where TEnum : struct, Enum =>
Enum.GetValues<TEnum>()
.Select(e => (Value: e, Desc: getString(e)))
.Where(x => string.Equals(x.Desc, enumDescription, comparison))
.Select(x => x.Value)
.FirstOrDefault();
/// <summary>
/// Return Enum value by description attribute
/// </summary>
/// <param name="enumDescription"></param>
/// <param name="comparison"></param>
/// <typeparam name="TEnum"></typeparam>
/// <returns></returns>
public static TEnum? GetEnumFromDescription<TEnum>(
string enumDescription,
StringComparison comparison = StringComparison.Ordinal)
where TEnum : struct, Enum =>
GetEnumByString<TEnum>(enumDescription, e => e.GetDescription(), comparison);
/// <summary>
/// Return Enum value by EnumMember attribute value
/// </summary>
/// <param name="enumDescription"></param>
/// <param name="comparison"></param>
/// <typeparam name="TEnum"></typeparam>
/// <returns></returns>
public static TEnum? GetEnumFromEnumMemberValue<TEnum>(
string enumDescription,
StringComparison comparison = StringComparison.Ordinal)
where TEnum : struct, Enum =>
GetEnumByString<TEnum>(enumDescription, e => e.GetEnumMemberValue(), comparison);
}