- Notifications
You must be signed in to change notification settings - Fork2
Actual C# Enums with values and better performance as a source generator
License
NotificationsYou must be signed in to change notification settings
Ceiridge/BetterEnums
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
A step in making C# enums usable in order to not fall behind Java.
A source generator that adds extension methods for enums with any attribute. Also adds more performant methods.
Install theNuGet orGitHub package.
[BetterEnum]// Add this attribute to the enumpublicenumExampleEnum{AnExample,// Add attributes to your enum members[ExampleEnumInfo("Hello",1)][Description("Another text")]Another,[Description("1")]One}
The following methods are now available via an extension class:
// Access the value attributes directlyExampleEnum.Another.GetExampleEnumInfo();// Retrieves the ExampleEnumInfo attribute value without reflectionExampleEnum.Another.GetDescription().Description;// Faster ToStringExampleEnum.AnExample.BetterToString();// Programmatically access an attribute (uses slow runtime reflection on each call)ExampleEnum.One.GetAttributeOfType<DescriptionAttribute>();
Generated source code for one example enum
[BetterEnum]publicenumExampleEnum{[ExampleEnumInfo("Example Text",123)][Description("Multiple attributes")]Example,[ExampleEnumInfo("Test Enum",5)]Test,[ExampleEnumInfo("Working enum",7)][Description("Even more attributes")]Working}
usingSystem;usingSystem.Reflection;namespaceBetterEnumsGen{publicstaticclassBetterEnumExtensions{privatestaticreadonlyBetterEnumsExample.ExampleEnumInfoAttribute?attr_24e6ce3758d72003196ef350428e4c1891570e9e5a2ba641ed73cea79a989ad0;privatestaticreadonlySystem.ComponentModel.DescriptionAttribute?attr_e770e50ffdea7a63dab5345238ae5f03a375d5a2e505ccf5f4f6baa9f6873a99;privatestaticreadonlyBetterEnumsExample.ExampleEnumInfoAttribute?attr_2cbdc8a4a473f08b7376601fc61353eb382f266e9d2d2856d0921461c9636c8a;privatestaticreadonlyBetterEnumsExample.ExampleEnumInfoAttribute?attr_5cd26a3daff2aa7ab2f9e7f1fa4e397a29f82e0c4a71e4cecf91aa9eb41c94a2;privatestaticreadonlySystem.ComponentModel.DescriptionAttribute?attr_feead0a86a3e9dd9da71d5161b6779d6ea88fc67a76495781fe836422a5e714e;/// <summary>/// Returns the enum member identifier name (more performant)/// </summary>publicstaticstringBetterToString(thisBetterEnumsExample.ExampleEnum@enum){return@enumswitch{BetterEnumsExample.ExampleEnum.Example=>nameof(BetterEnumsExample.ExampleEnum.Example),BetterEnumsExample.ExampleEnum.Test=>nameof(BetterEnumsExample.ExampleEnum.Test),BetterEnumsExample.ExampleEnum.Working=>nameof(BetterEnumsExample.ExampleEnum.Working),_=>thrownewArgumentOutOfRangeException(nameof(@enum),@enum,null)};}/// <summary>/// Returns the respective attribute of the given enum./// May return null if the enum does not have that attribute./// </summary>publicstaticBetterEnumsExample.ExampleEnumInfoAttribute?GetExampleEnumInfo(thisBetterEnumsExample.ExampleEnum@enum){return@enumswitch{BetterEnumsExample.ExampleEnum.Example=>attr_24e6ce3758d72003196ef350428e4c1891570e9e5a2ba641ed73cea79a989ad0,BetterEnumsExample.ExampleEnum.Test=>attr_2cbdc8a4a473f08b7376601fc61353eb382f266e9d2d2856d0921461c9636c8a,BetterEnumsExample.ExampleEnum.Working=>attr_5cd26a3daff2aa7ab2f9e7f1fa4e397a29f82e0c4a71e4cecf91aa9eb41c94a2,_=>null};}/// <summary>/// Returns the respective attribute of the given enum./// May return null if the enum does not have that attribute./// </summary>publicstaticSystem.ComponentModel.DescriptionAttribute?GetDescription(thisBetterEnumsExample.ExampleEnum@enum){return@enumswitch{BetterEnumsExample.ExampleEnum.Example=>attr_e770e50ffdea7a63dab5345238ae5f03a375d5a2e505ccf5f4f6baa9f6873a99,BetterEnumsExample.ExampleEnum.Working=>attr_feead0a86a3e9dd9da71d5161b6779d6ea88fc67a76495781fe836422a5e714e,_=>null};}// Finds all attributes once at runtimestaticBetterEnumExtensions(){object[]attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890=GetEnumAttributes(typeof(BetterEnumsExample.ExampleEnum));attr_24e6ce3758d72003196ef350428e4c1891570e9e5a2ba641ed73cea79a989ad0=0>=attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890.Length?null:attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890[0]asBetterEnumsExample.ExampleEnumInfoAttribute;attr_e770e50ffdea7a63dab5345238ae5f03a375d5a2e505ccf5f4f6baa9f6873a99=1>=attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890.Length?null:attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890[1]asSystem.ComponentModel.DescriptionAttribute;attr_2cbdc8a4a473f08b7376601fc61353eb382f266e9d2d2856d0921461c9636c8a=2>=attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890.Length?null:attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890[2]asBetterEnumsExample.ExampleEnumInfoAttribute;attr_5cd26a3daff2aa7ab2f9e7f1fa4e397a29f82e0c4a71e4cecf91aa9eb41c94a2=3>=attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890.Length?null:attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890[3]asBetterEnumsExample.ExampleEnumInfoAttribute;attr_feead0a86a3e9dd9da71d5161b6779d6ea88fc67a76495781fe836422a5e714e=4>=attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890.Length?null:attrs_7299f2836dc3779f856acae2b30cad36ea256b0f96ef137f9a8298c8ad88f890[4]asSystem.ComponentModel.DescriptionAttribute;}// Taken from https://stackoverflow.com/questions/1799370/getting-attributes-of-enums-value/// <summary>/// Gets an attribute on an enum field value/// </summary>/// <typeparam name="T">The type of the attribute you want to retrieve</typeparam>/// <param name="enumVal">The enum value</param>/// <returns>The attribute of type T that exists on the enum value</returns>/// <example><![CDATA[string desc = myEnumVariable.GetAttributeOfType<DescriptionAttribute>().Description;]]></example>publicstaticT?GetAttributeOfType<T>(thisEnumenumVal)whereT:System.Attribute{Typetype=enumVal.GetType();MemberInfo[]memInfo=type.GetMember(enumVal.ToString());object[]attributes=memInfo[0].GetCustomAttributes(typeof(T),false);return(attributes.Length>0)?(T)attributes[0]:null;}privatestaticobject[]GetEnumAttributes(TypeenumType){returnenumType.GetMembers().Where(member=>member.MemberType==MemberTypes.Field&&((FieldInfo)member).FieldType==enumType).Select(member=>member.GetCustomAttributes(false)).SelectMany(attributeList=>attributeList).ToArray();}}}
About
Actual C# Enums with values and better performance as a source generator
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.