public abstract class Enumeration<T> where T : struct, IComparable
public string Value { get; }
protected Enumeration(T id, string @value)
public class Status : Enumeration<byte>
public static readonly Status Booked = new Status(0, "PENDING");
public static readonly Status Reserved = new Status(1, "FINISHED");
private Status(byte id, string name) : base(id, name)
public static Wrapper<Status> Create (string @value)
return Wrapper.Wrap(Booked);
public static Wrapper<T> Wrap<T>(T @value)
return new Wrapper<T>(@value);
internal Wrapper(T @value)
public class BankPaymentStatusConverter<TValue> : ITypeConverter<string, Wrapper<TValue>> where TValue : Status
public Wrapper<TValue> Convert(string source, Wrapper<TValue> destination, ResolutionContext context)
return Status.Create(source);
public static void Main()
Console.WriteLine("Hello World");