A C# demonstration of the Java-style Enum (or "Smart Enum") pattern. Enums that carry behavior, not just values.
Standard C# enums are glorified integers:
public enum DayEnum { Monday, Tuesday, ... }They cannot hold methods or state. In Java, enums are full objects, and each constant can override methods. This project shows how to replicate that in C#.
*for everyone who doesn't want to introduce another NuGet package dependency.
Day is an abstract record with static singleton instances acting as the enum constants. It declares a DayEnum property that serves as a stable, serialization-friendly identity for each constant, useful for persistence, mapping, or switch expressions:
public abstract record Day
{
public static readonly Day Monday = new MondayDay();
public static readonly Day Tuesday = new TuesdayDay();
// ...
public abstract DayEnum DayEnum { get; }
public abstract string TellItLikeItIs();
}Each constant is a sealed record that implements both:
public sealed record MondayDay : Day
{
public override DayEnum DayEnum => DayEnum.Monday;
public override string TellItLikeItIs() => "Mondays are bad.";
}Usage reads exactly like a regular enum, but answers polymorphically without a switch:
Day today = Day.Monday;
Console.WriteLine(today.TellItLikeItIs()); // "Mondays are bad."DayMapper shows DayEnum in action for the reverse mapping (Day -> DayOfWeek):
public DayOfWeek Map(Day day)
{
return day.DayEnum switch
{
DayEnum.Monday => DayOfWeek.Monday,
DayEnum.Tuesday => DayOfWeek.Tuesday,
// ...
};
}In short: Day is the rich behavior object; DayEnum is its lightweight, portable name tag.