using System.Collections.Generic;
public static void Main()
var emp1 = EmployeeTypes.FullTime;
var emp2 = EmployeeTypes.FromValue<EmployeeTypes>(2);
var emp3 = EmployeeTypes.FromDisplayName<EmployeeTypes>("Intern");
Console.WriteLine(emp1.Id);
public class EmployeeTypes : Enumeration
public static EmployeeTypes FullTime = new EmployeeTypes(1, "FullTime");
public static EmployeeTypes PartTime = new EmployeeTypes(2, "PartTime");
public static EmployeeTypes Intern = new EmployeeTypes(3, "Intern");
public EmployeeTypes() : base() { }
public EmployeeTypes(int id, string name) : base(id, name) { }
public abstract class Enumeration : IComparable
public string Name { get; set; }
public int Id { get; set; }
protected Enumeration() { }
protected Enumeration(int id, string name)
public int CompareTo(object other) => Id.CompareTo(((Enumeration)other).Id);
public override string ToString() => Name;
public static IEnumerable<T> GetAll<T>() where T : Enumeration
var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
return fields.Select(f => f.GetValue(null)).Cast<T>();
public static T FromValue<T>(int value) where T : Enumeration
var matchingItem = Parse<T, int>(value, "value", item => item.Id == value);
public static T FromDisplayName<T>(string displayName) where T : Enumeration
var matchingItem = Parse<T, string>(displayName, "display name", item => item.Name == displayName);
private static T Parse<T, K>(K value, string description, Func<T, bool> predicate) where T : Enumeration
var matchingItem = GetAll<T>().FirstOrDefault(predicate);
if (matchingItem == null)
throw new InvalidOperationException($"'{value}' is not a valid {description} in {typeof(T)}");