|
|
|
|
using System;
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel
|
|
|
|
|
{
|
|
|
|
|
public static class EnumExtensions
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets an attribute on an enum field value
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T">The type of the attribute you want to retrieve</typeparam>
|
|
|
|
|
/// <param name="enumVal">The enum value</param>
|
|
|
|
|
/// <returns>The attribute of type T that exists on the enum value</returns>
|
|
|
|
|
/// <example>string desc = myEnumVariable.GetAttributeOfType<DescriptionAttribute/>().Description;</example>
|
|
|
|
|
public static T GetAttributeOfType<T>(this Enum enumVal)
|
|
|
|
|
where T : Attribute
|
|
|
|
|
{
|
|
|
|
|
var type = enumVal.GetType();
|
|
|
|
|
var memInfo = type.GetMember(enumVal.ToString());
|
|
|
|
|
var attributes = memInfo[0].GetCustomAttributes(typeof(T), false);
|
|
|
|
|
return ((attributes.Length > 0) ? (T)attributes[0] : null)!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Description(this Enum enumVal)
|
|
|
|
|
{
|
|
|
|
|
var attr = enumVal.GetAttributeOfType<DescriptionAttribute>();
|
|
|
|
|
return attr?.Description!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static T GetValueFromDescription<T>(string description)
|
|
|
|
|
{
|
|
|
|
|
var type = typeof(T);
|
|
|
|
|
if (!type.IsEnum) throw new InvalidOperationException();
|
|
|
|
|
foreach (var field in type.GetFields())
|
|
|
|
|
{
|
|
|
|
|
var attribute = Attribute.GetCustomAttribute(field,
|
|
|
|
|
typeof(DescriptionAttribute)) as DescriptionAttribute;
|
|
|
|
|
if (attribute != null!)
|
|
|
|
|
{
|
|
|
|
|
if (attribute.Description == description)
|
|
|
|
|
return (T)field.GetValue(null);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (field.Name == description)
|
|
|
|
|
return (T)field.GetValue(null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
throw new ArgumentException("Not found.", nameof(description));
|
|
|
|
|
// or return default(T)!;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|