RSCG – FusionReactor
name | FusionReactor |
nuget | https://www.nuget.org/packages/FusionReactor.SourceGenerators.EnumExtensions |
link | https://github.com/OhFlowi/FusionReactor.SourceGenerators.EnumExtensions |
author | OhFlowi |
Enums to string and other extensions
This is how you can use FusionReactor .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <PackageReference Include="FusionReactor.SourceGenerators.EnumExtensions" Version="1.1.0" /> </ItemGroup> </Project>
The code that you will use is
using EnumClassDemo; Console.WriteLine(Colors.None.GetName()); Console.WriteLine(ColorsExtensions.GetContent()[Colors.None]);
using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; namespace EnumClassDemo; //[Flags] [FusionReactor.SourceGenerators.EnumExtensions.GenerateEnumExtensions] public enum Colors { [Display( ShortName = "None", Name = "none - 0", Description = "Zero", Prompt = "ooF", GroupName = "Color1", Order = 0)] None =0, Red=1, Green=2, Blue=4, }
The code that is generated is
// <auto-generated /> #nullable enable using System; using System.CodeDom.Compiler; using System.Collections; #if NET8_0_OR_GREATER using System.Collections.Frozen; #endif using System.Collections.Generic; using System.Collections.ObjectModel; namespace EnumClassDemo; /// <summary> /// Extension methods for the <see cref = "Colors"/> enum. /// </summary> [GeneratedCode("FusionReactor.SourceGenerators.EnumExtensions", null)] public static partial class ColorsExtensions { #if NET8_0_OR_GREATER private static readonly FrozenDictionary<Colors, Int32> content = new Dictionary<Colors, Int32> { { Colors.None, 0 }, { Colors.Red, 1 }, { Colors.Green, 2 }, { Colors.Blue, 4 }, } .ToFrozenDictionary(); #else private static readonly Dictionary<Colors, Int32> contentDictionary = new Dictionary<Colors, Int32> { { Colors.None, 0 }, { Colors.Red, 1 }, { Colors.Green, 2 }, { Colors.Blue, 4 }, }; private static readonly IReadOnlyDictionary<Colors, Int32> content = new ReadOnlyDictionary<Colors, Int32>(contentDictionary); #endif #if NET8_0_OR_GREATER private static readonly FrozenSet<string> names = new [] { "None", "Red", "Green", "Blue", } .ToFrozenSet(); #elif NET5_0_OR_GREATER private static readonly IReadOnlySet<string> names = new HashSet<string>() { "None", "Red", "Green", "Blue", }; #else private static readonly HashSet<string> names = new HashSet<string>() { "None", "Red", "Green", "Blue", }; #endif #if NET8_0_OR_GREATER private static readonly FrozenSet<Colors> values = new [] { Colors.None, Colors.Red, Colors.Green, Colors.Blue, } .ToFrozenSet(); #elif NET5_0_OR_GREATER private static readonly IReadOnlySet<Colors> values = new HashSet<Colors>() { Colors.None, Colors.Red, Colors.Green, Colors.Blue, }; #else private static readonly HashSet<Colors> values = new HashSet<Colors>() { Colors.None, Colors.Red, Colors.Green, Colors.Blue, }; #endif /// <summary> /// Gets the content dictionary containing mappings of <see cref = "Colors"/> enum values to values. /// </summary> /// <returns>The read-only content dictionary.</returns> #if NET8_0_OR_GREATER public static FrozenDictionary<Colors, Int32> GetContent() #else public static IReadOnlyDictionary<Colors, Int32> GetContent() #endif { return content; } /// <summary> /// Gets the content dictionary containing mappings of <see cref = "Colors"/> enum values to values. /// </summary> /// <param name = "enumValue">The enum value for which to get the content dictionary.</param> /// <returns>The read-only content dictionary.</returns> #if NET8_0_OR_GREATER public static FrozenDictionary<Colors, Int32> GetContent(this Colors enumValue) #else public static IReadOnlyDictionary<Colors, Int32> GetContent(this Colors enumValue) #endif { return content; } /// <summary> /// Retrieves the name of the constant in the <see cref = "Colors"/>. /// </summary> /// <param name = "enumValue">The enum value to convert.</param> /// <returns> /// A string containing the name of the <see cref = "Colors"/>; /// or <see langword="null"/> if no such constant is found. /// </returns> public static string? GetName(this Colors enumValue) { return enumValue switch { Colors.None => nameof(Colors.None), Colors.Red => nameof(Colors.Red), Colors.Green => nameof(Colors.Green), Colors.Blue => nameof(Colors.Blue), _ => null }; } /// <summary> /// Retrieves all available names of the <see cref = "Colors"/>. /// </summary> /// <returns>An enumerable collection of <see cref = "Colors"/> names.</returns> #if NET8_0_OR_GREATER public static FrozenSet<string> GetNames() #elif NET5_0_OR_GREATER public static IReadOnlySet<string> GetNames() #else public static HashSet<string> GetNames() #endif { return names; } /// <summary> /// Retrieves all available names of the <see cref = "Colors"/>. /// </summary> /// <param name = "enumValue">The enumeration value.</param> /// <returns>An enumerable collection of <see cref = "Colors"/> names.</returns> #if NET8_0_OR_GREATER public static FrozenSet<string> GetNames(this Colors enumValue) #elif NET5_0_OR_GREATER public static IReadOnlySet<string> GetNames(this Colors enumValue) #else public static HashSet<string> GetNames(this Colors enumValue) #endif { return names; } /// <summary> /// Retrieves all available values of the <see cref = "Colors"/>. /// </summary> /// <returns>An enumerable collection of <see cref = "Colors"/> values.</returns> #if NET8_0_OR_GREATER public static FrozenSet<Colors> GetValues() #elif NET5_0_OR_GREATER public static IReadOnlySet<Colors> GetValues() #else public static HashSet<Colors> GetValues() #endif { return values; } /// <summary> /// Retrieves all available values of the <see cref = "Colors"/>. /// </summary> /// <param name = "enumValue">The enumeration value.</param> /// <returns>An enumerable collection of <see cref = "Colors"/> values.</returns> #if NET8_0_OR_GREATER public static FrozenSet<Colors> GetValues(this Colors enumValue) #elif NET5_0_OR_GREATER public static IReadOnlySet<Colors> GetValues(this Colors enumValue) #else public static HashSet<Colors> GetValues(this Colors enumValue) #endif { return values; } /// <summary> /// Parses the specified string representation of the enumeration value to its corresponding /// <see cref = "Colors"/> value. /// </summary> /// <param name = "value">A string containing the name or value to convert.</param> /// <param name = "ignoreCase"> /// A boolean indicating whether to ignore case during the parsing. Default is <c>false</c>. /// </param> /// <returns> /// The <see cref = "Colors"/> value equivalent to the specified string representation. /// </returns> public static Colors Parse(string value, bool ignoreCase = false) { if (ignoreCase) { return value.ToLowerInvariant() switch { "none" => Colors.None, "red" => Colors.Red, "green" => Colors.Green, "blue" => Colors.Blue, _ => throw new ArgumentException(), }; } else { return value switch { "None" => Colors.None, "Red" => Colors.Red, "Green" => Colors.Green, "Blue" => Colors.Blue, _ => throw new ArgumentException(), }; } } /// <summary> /// Parses the specified string representation of the enumeration value to its corresponding /// <see cref = "Colors"/> value. /// </summary> /// <param name = "enumValue">The current <see cref = "Colors"/> value.</param> /// <param name = "value">A string containing the name or value to convert.</param> /// <param name = "ignoreCase"> /// A boolean indicating whether to ignore case during the parsing. Default is <c>false</c>. /// </param> /// <returns> /// The <see cref = "Colors"/> value equivalent to the specified string representation. /// </returns> public static Colors Parse(this Colors enumValue, string value, bool ignoreCase = false) { if (ignoreCase) { return value.ToLowerInvariant() switch { "none" => Colors.None, "red" => Colors.Red, "green" => Colors.Green, "blue" => Colors.Blue, _ => throw new ArgumentException(), }; } else { return value switch { "None" => Colors.None, "Red" => Colors.Red, "Green" => Colors.Green, "Blue" => Colors.Blue, _ => throw new ArgumentException(), }; } } /// <summary> /// Tries to parse the specified string representation of an enumeration value to its corresponding /// <see cref = "Colors"/> enumeration value. /// </summary> /// <param name = "value">The string representation of the enumeration value.</param> /// <param name = "result"> /// When this method returns, contains the <see cref = "Colors"/> value equivalent /// to the string representation, if the parse succeeded, or default(Colors) if the parse failed.</param> /// <returns><c>true</c> if the parsing was successful; otherwise, <c>false</c>.</returns> public static bool TryParse(string value, out Colors? result) { return TryParse(value, false, out result); } /// <summary> /// Tries to parse the specified string representation of an enumeration value to its corresponding /// <see cref = "Colors"/> enumeration value. /// </summary> /// <param name = "value">The string representation of the enumeration value.</param> /// <param name = "ignoreCase">A boolean indicating whether case should be ignored when parsing.</param> /// <param name = "result"> /// When this method returns, contains the <see cref = "Colors"/> value equivalent /// to the string representation, if the parse succeeded, or default(Colors) if the parse failed.</param> /// <returns><c>true</c> if the parsing was successful; otherwise, <c>false</c>.</returns> public static bool TryParse(string value, bool ignoreCase, out Colors? result) { if (ignoreCase) { result = value.ToLowerInvariant() switch { "none" => Colors.None, "red" => Colors.Red, "green" => Colors.Green, "blue" => Colors.Blue, _ => null, }; } else { result = value switch { "None" => Colors.None, "Red" => Colors.Red, "Green" => Colors.Green, "Blue" => Colors.Blue, _ => null, }; } return result != null; } /// <summary> /// Tries to parse the specified string representation of an enumeration value to its corresponding /// <see cref = "Colors"/> enumeration value. /// </summary> /// <param name = "enumValue">The enumeration value to parse.</param> /// <param name = "value">The string representation of the enumeration value.</param> /// <param name = "result"> /// When this method returns, contains the <see cref = "Colors"/> value equivalent /// to the string representation, if the parse succeeded, or default(Colors) if the parse failed.</param> /// <returns><c>true</c> if the parsing was successful; otherwise, <c>false</c>.</returns> public static bool TryParse(this Colors enumValue, string value, out Colors? result) { return TryParse(value, false, out result); } /// <summary> /// Tries to parse the specified string representation of an enumeration value to its corresponding /// <see cref = "Colors"/> enumeration value. /// </summary> /// <param name = "enumValue">The enumeration value to parse.</param> /// <param name = "value">The string representation of the enumeration value.</param> /// <param name = "ignoreCase">A boolean indicating whether case should be ignored when parsing.</param> /// <param name = "result"> /// When this method returns, contains the <see cref = "Colors"/> value equivalent /// to the string representation, if the parse succeeded, or default(Colors) if the parse failed.</param> /// <returns><c>true</c> if the parsing was successful; otherwise, <c>false</c>.</returns> public static bool TryParse(this Colors enumValue, string value, bool ignoreCase, out Colors? result) { if (ignoreCase) { result = value.ToLowerInvariant() switch { "none" => Colors.None, "red" => Colors.Red, "green" => Colors.Green, "blue" => Colors.Blue, _ => null, }; } else { result = value switch { "None" => Colors.None, "Red" => Colors.Red, "Green" => Colors.Green, "Blue" => Colors.Blue, _ => null, }; } return result != null; } }
// <auto-generated /> #nullable enable using System; using System.Collections; #if NET8_0_OR_GREATER using System.Collections.Frozen; #endif using System.Collections.Generic; using System.Collections.ObjectModel; using FusionReactor.SourceGenerators.EnumExtensions; namespace EnumClassDemo; public static partial class ColorsExtensions { #if !NET8_0_OR_GREATER private static readonly Dictionary<Colors, DisplayResult?> displayResultsDictionary = new Dictionary<Colors, DisplayResult?> { { Colors.None, new DisplayResult { ShortName = "None", Name = "none - 0", Description = "Zero", Prompt = "ooF", GroupName = "Color1", Order = 0, } }, { Colors.Red, null }, { Colors.Green, null }, { Colors.Blue, null }, }; #endif /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute"/> of the <see cref = "Colors"/> enum. /// </summary> /// <returns>The display attribute result or the enum value.</returns> #if NET8_0_OR_GREATER public static FrozenDictionary<Colors, DisplayResult?> DisplayResults => new Dictionary<Colors, DisplayResult?> { { Colors.None, new DisplayResult {ShortName = "None", Name = "none - 0", Description = "Zero", Prompt = "ooF", GroupName = "Color1", Order = 0, }}, { Colors.Red, null }, { Colors.Green, null }, { Colors.Blue, null }, } .ToFrozenDictionary(); #else public static IReadOnlyDictionary<Colors, DisplayResult?> DisplayResults => new ReadOnlyDictionary<Colors, DisplayResult?>(displayResultsDictionary); #endif /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.ShortName"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The display name or the enum value.</returns> public static string? DisplayShortName(this Colors enumValue) { return enumValue switch { Colors.None => "None", Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.Name"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The name or the enum value.</returns> public static string? DisplayName(this Colors enumValue) { return enumValue switch { Colors.None => "none - 0", Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.Description"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The display name or the enum value.</returns> public static string? DisplayDescription(this Colors enumValue) { return enumValue switch { Colors.None => "Zero", Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.Prompt"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The display name or the enum value.</returns> public static string? DisplayPrompt(this Colors enumValue) { return enumValue switch { Colors.None => "ooF", Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.GroupName"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The display name or the enum value.</returns> public static string? DisplayGroupName(this Colors enumValue) { return enumValue switch { Colors.None => "Color1", Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } /// <summary> /// Returns the <see cref = "System.ComponentModel.DataAnnotations.DisplayAttribute.Order"/> of the <see cref = "Colors"/> enum. /// </summary> /// <param name = "enumValue">The enum value.</param> /// <returns>The display name or the enum value.</returns> public static int? DisplayOrder(this Colors enumValue) { return enumValue switch { Colors.None => 0, Colors.Red => null, Colors.Green => null, Colors.Blue => null, _ => null }; } }
// <auto-generated /> #nullable enable using System; using System.CodeDom.Compiler; namespace FusionReactor.SourceGenerators.EnumExtensions; /// <inheritdoc cref = "System.ComponentModel.DataAnnotations.DisplayAttribute"/> [GeneratedCode("FusionReactor.SourceGenerators.EnumExtensions", null)] public class DisplayResult { /// <summary> /// Gets or sets the ShortName attribute property, which may be a resource key string. /// </summary> public string? ShortName { get; set; } /// <summary> /// Gets or sets the Name attribute property, which may be a resource key string. /// </summary> public string? Name { get; set; } /// <summary> /// Gets or sets the Description attribute property, which may be a resource key string. /// </summary> public string? Description { get; set; } /// <summary> /// Gets or sets the Prompt attribute property, which may be a resource key string. /// </summary> public string? Prompt { get; set; } /// <summary> /// Gets or sets the GroupName attribute property, which may be a resource key string. /// </summary> public string? GroupName { get; set; } /// <summary> /// Gets or sets the order in which this field should be displayed. If this property is not set then /// the presentation layer will automatically determine the order. Setting this property explicitly /// allows an override of the default behavior of the presentation layer. /// </summary> public int? Order { get; set; } }
// <auto-generated /> using System; using System.CodeDom.Compiler; namespace FusionReactor.SourceGenerators.EnumExtensions; /// <summary> /// Attribute to mark an enum for FusionReactor.SourceGenerators.EnumExtensions extension generations. /// </summary> /// <remarks> /// This attribute is used to mark an enum for FusionReactor.SourceGenerators.EnumExtensions extension generations. /// </remarks> [GeneratedCode("FusionReactor.SourceGenerators.EnumExtensions", null)] [AttributeUsage(AttributeTargets.Enum)] public class GenerateEnumExtensionsAttribute : Attribute { }
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/FusionReactor
Leave a Reply