using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace Helpers
{
public class EnumHelper
{
public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return defaultValue;
if (!Enum.TryParse<T>(value, out var enumValue)) return defaultValue;
return enumValue;
}
public static string GetDescription<T>(T enumValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) return null;
var description = enumValue.ToString();
var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
if (fieldInfo != null)
{
var attrs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attrs != null && attrs.Length > 0)
{
description = ((DescriptionAttribute)attrs[0]).Description;
}
}
return description;
}
public static IEnumerable<string> GetEnumDescriptionValues(Type enumType)
{
return Enum.GetNames(enumType)
.Select(x =>
{
var attributes = enumType.GetField(x).GetCustomAttributes(true);
var attribute = attributes.FirstOrDefault(a => a is DescriptionAttribute) as DescriptionAttribute;
return attribute?.Description ?? x;
});
}
public static T ParseEnumDescriptionValues<T>(string value) where T : IConvertible
{
value = value?.ToLowerInvariant()?.Trim();
var enumType = typeof(T);
Dictionary<string, int> d = GetEnumDict(enumType);
var result = d.ContainsKey(value) ? d[value] : 0;
return (T)Convert.ChangeType(result, Enum.GetUnderlyingType(typeof(T)));
}
private static Dictionary<string, int> GetEnumDict(Type enumType)
{
var d = new Dictionary<string, int>();
Array.ForEach(Enum.GetNames(enumType), x =>
{
var v = Enum.Parse(enumType, x);
var i = (int)v;
d.Add(x.ToLowerInvariant(), i);
var attributes = enumType.GetField(x).GetCustomAttributes(true);
var attribute = attributes.FirstOrDefault(a => a is DescriptionAttribute) as DescriptionAttribute;
if (attribute != null && !d.ContainsKey(attribute.Description))
d.Add(attribute.Description?.ToLowerInvariant(), i);
});
return d;
}
}
}
public static class EnumUtils
{
public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return defaultValue;
if (TryParseEnumDescriptionValues<T>(value, out var enumValue))
{
return enumValue;
}
if (Enum.TryParse<T>(value, out var enumValue2))
{
return enumValue2;
}
return defaultValue;
}
public static bool TryParseEnumDescriptionValues<T>(string inValue, out T value) where T : struct, IConvertible
{
var items = GetEnumDescriptionValues<T>();
var item = items.FirstOrDefault(x => StringHelper.Equals(x.Item1, inValue));
if (item != null) {
value = item.Item2;
return true;
}
value = default(T);
return false;
}
public static IEnumerable<Tuple<string, T>> GetEnumDescriptionValues<T>() where T : struct, IConvertible
{
var enumType = typeof(T);
return Enum.GetValues(enumType).Cast<T>().Select(x => new Tuple<string, T>(GetDescription(x) , x));
}
public static IEnumerable<string> GetEnumDescriptionValues(Type enumType)
{
return Enum.GetNames(enumType)
.Select(x =>
{
var attributes = enumType.GetField(x).GetCustomAttributes(true);
var attribute = attributes.FirstOrDefault(a => a is DescriptionAttribute) as DescriptionAttribute;
return attribute?.Description ?? x;
});
}
public static string GetDescription<T>(T enumValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) return null;
var description = enumValue.ToString();
var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
if (fieldInfo != null)
{
var attrs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attrs != null && attrs.Length > 0)
{
description = ((DescriptionAttribute)attrs[0]).Description;
}
}
return description;
}
}284400cookie-checkC# Enum Helper