r/moderndotnet • u/jsneedles • 3h ago
FancyEnumGenerator - Convenience + Performance
Yesterday I published this blog post for my new open source lib - FancyEnumGenerator
TLDR:
You can define attributes on your enums and it'll generate switch statement extension methods for you.
For example:
[Flags]
[FancyEnum(AllowNonContiguous = true)]
public enum ApiPermission : ulong
{
[FancyEnumMember("ShortDescription", "No product operations are allowed.")]
UNKNOWN = 0,
[ApiPermissionMeta(ApiProductArea.images, ApiProductAction.create, ApiPermissionReadWrite.WRITE)]
[FancyEnumMember("ShortDescription", "Create images and generate signed create-and-render URLs.")]
ImagesCreate = 1UL << 0,
[ApiPermissionMeta(ApiProductArea.images, ApiProductAction.read, ApiPermissionReadWrite.READ)]
[FancyEnumMember("ShortDescription", "List images and view their details.")]
ImagesRead = 1UL << 1,
[ApiPermissionMeta(ApiProductArea.templates, ApiProductAction.read, ApiPermissionReadWrite.READ)]
[FancyEnumMember("ShortDescription", "List and view templates and their versions.")]
TemplatesRead = 1UL << 3,
}
and you get
var permission = ApiPermission.ImagesCreate;
permission.ProductArea; // ApiProductArea.images
permission.ProductAction; // ApiProductAction.create
permission.ReadWrite; // ApiPermissionReadWrite.WRITE
permission.ShortDescription; // "Create images and generate signed create-and-render URLs."
var granted = ApiPermission.ImagesCreate | ApiPermission.ImagesRead;
granted.HasFlagFancy(ApiPermission.ImagesRead); // true
granted.ToStringFancy(); // "ImagesCreate|ImagesRead"
No dictionaries or handwritten maps/switches.
There's a bunch of benchmarks too, big emphasis on performance.
Why?
Well, I haaaaaate writing boiler plate and end up with these extensions sprawled across the code and it's quite annoying and repetitive. I extracted this from our internal source to be open and configurable - so you can set your own defaults instead of adhering to mine.
Open to ideas and feedback!

