{"id":13629386,"url":"https://github.com/ashenBlade/EnumClass","last_synced_at":"2025-04-17T09:33:33.618Z","repository":{"id":157907200,"uuid":"630287277","full_name":"ashenBlade/EnumClass","owner":"ashenBlade","description":"Souce Generator that will generate Kotlin like enum class but in C#","archived":false,"fork":false,"pushed_at":"2023-06-09T17:48:00.000Z","size":295,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-11-01T03:04:30.274Z","etag":null,"topics":["csharp","csharp-sourcegenerator","dotnet","enum-class","enumeration","generator","roslyn","source-generator"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ashenBlade.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-04-20T04:07:34.000Z","updated_at":"2023-12-20T05:37:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"580d3b86-5ced-4937-ae18-e9c179561b73","html_url":"https://github.com/ashenBlade/EnumClass","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ashenBlade%2FEnumClass","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ashenBlade%2FEnumClass/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ashenBlade%2FEnumClass/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ashenBlade%2FEnumClass/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ashenBlade","download_url":"https://codeload.github.com/ashenBlade/EnumClass/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223751082,"owners_count":17196566,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","csharp-sourcegenerator","dotnet","enum-class","enumeration","generator","roslyn","source-generator"],"created_at":"2024-08-01T22:01:09.123Z","updated_at":"2024-11-08T20:30:50.016Z","avatar_url":"https://github.com/ashenBlade.png","language":"C#","readme":"![logo](icon.png \"Enum Class Generator Logo\" )\n\n# `enum class` Generator\n\n## Summary\n\nType-safe source-generated alternative to C# `enum` inspired by Kotlin `enum class`\n\n## What is it?\n\nThis library contains source generator that creates `class` for specified `enum`. \nThese classes contain similar functionality as original enum, but behave as ordinal `class`\n\n## Getting started\n\n### Installation\n\n1. Add reference to Nuget package\n\n- .NET CLI\n\n```bash\ndotnet add package EnumClass --version 1.2.0\n```\n\n- Package Manager\n\n```\nInstall-Package EnumClass -Version 1.2.0\n```\n\n- PackageReference\n\n```\n\u003cPackageReference Include=\"EnumClass\" Version=\"1.2.0\" /\u003e\n```\n\n2. Specify _Analyzer_ property in `.csproj`\n\n```\n\u003cPackageReference Include=\"EnumClass\" Version=\"1.2.0\" OutputItemType=\"Analyzer\"/\u003e\n```\n\n\n## Usage\n\n### Example usage\n\nAdd `[EnumClass]` attribute to enum\n\nThat is all! \nCorresponding class will be generated in namespace as your enum, but prefixed with **EnumClass**\n\nExample\n```csharp\nusing EnumClass.Attributes;\n\nnamespace Domain\n{\n    [EnumClass]\n    public enum PetKind\n    {\n        Cat,\n        Dog\n    }\n    \n    namespace EnumClass\n    {\n        public partial abstract class PetKind\n        {\n            public partial class CatEnumValue\n            {\n                public void SayMeow()\n                {\n                    System.Console.WriteLine(\"Meow!\");\n                }\n            }\n        }\n    }\n}\n```\n### ToString()\n\nAll `ToString()` are generated at compile time.\nBy default, they equal to name of corresponding member.\n```csharp\nConsole.WriteLine(EnumClass.PetKind.Cat.ToString() == \"Cat\"); \n// Output: true\n```\n\nIf you want to override default value - use `[EnumMemberInfo(StringValue = \"\")]` attribute\n```csharp\nnamespace Domain;\n\n[EnumClass]\npublic enum PetKind\n{\n    [EnumMemberInfo(StringValue = \"Kitten\")]\n    Cat,\n    Dog\n}\n// -------------\n\nConsole.WriteLine(EnumClass.PetKind.Cat.ToString());\n// Output: Kitten\n```\n\n### Cast to enum\n\nAll classes have overriden cast operator to original enum value\n```csharp\nConsole.WriteLine(((PetKind)EnumClass.PetKind.Cat) == PetKind.Cat); \n// Output: true\n```\n\n### Cast to `int`\n\nAll classes have overriden cast to `int`\n```csharp\nConsole.WriteLine(((int)EnumClass.PetKind.Cat) == ((int)PetKind.Cat)); \n// Output: true\n```\n\n### `Equals()`\n\nGenerated classes implement `IEquatable\u003c\u003e` both for enum class and original enum.\nThus, has methods `Equals(EnumClass)` and `Equals(OrignalEnum)`\n\n```csharp\nConsole.WriteLine(EnumClass.PetKind.Cat.Equals(EnumClass.PetKind.Cat)); // Calls Equals(EnumClass.PetKind)\nConsole.WriteLine(EnumClass.PetKind.Cat.Equals(EnumClass.PetKind.Dog)); // Calls Equals(EnumClass.PetKind)\nConsole.WriteLine(EnumClass.PetKind.Cat.Equals(PetKind.Cat)); // Calls Equals(PetKind)\nConsole.WriteLine(EnumClass.PetKind.Cat.Equals(PetKind.Dog)); // Calls Equals(PetKind)\n// Output: true\n//         false\n//         true\n//         false\n```\n\nP.S. and of course `Equals(object?)`\n\n### `Switch` function\n\nInstead of writing `switch` every time, a fimily\nof switch function is generated. \nThey accepts both `Action` and `Func` with enum class at first argument and optional additional arguments.\n\nE.g. \n1. `Func\u003cint\u003e`\n```csharp\nvar cat = EnumClass.PetKind.Cat;\nvar value = cat.Switch(1,\n        (cat, i) =\u003e i + 1,\n        (dog, i) =\u003e i * 100);\nConsole.WriteLine(value); \n// Output: 2\n```\n\n2. `Action`\n```csharp\nvar dog = EnumClass.PetKind.Dog;\ndog.Switch(\n    cat =\u003e cat.SayMeow(),\n    dog =\u003e Console.WriteLine(\"Oh, it is puppy!\")); \n// Output: Oh, it is puppy!\n```\n\n### `TryParse`\n\nThere is static function `bool EnumClass.TryParse(string value, out EnumClass enumClass)` for parsing values from raw enums.\nThis function accepts strings with and without enum name: **PetKind.Cat** and **Cat** will be parsed into Cat value.\n\n```csharp\nif (EnumClass.PetKind.TryParse(\"Cat\", out var cat)\n{\n    Console.WriteLine($\"This is cat!! {cat}\");\n}\nelse\n{\n    Console.WriteLine(\"This is not cat\");\n}\n```\n\n### More\n\nFor more examples checkout _samples_ folder\n\n## Features\n\n### Incremental generator\n\nIt uses incremental generator instead of source generator.\nThis implies better performance in comparison\n\n\n### Custom target namespace\n\nBy default generated class contained in the same namespace as original enum + \".EnumClass\" suffix.\nYou can manually set target namespace in `Namespace` property of `[EnumClass]` attribute.\n\n```csharp\nusing EnumClass.Attributes;\n\nnamespace Test;\n\n[EnumClass(Namespace = \"Domain\")]\npublic enum SampleEnum\n{\n    First,\n    Second\n}\n//------------------\nusing Domain;\n\nConsole.WriteLine(SampleEnum.First);\n```\n\n### Generate `enum class` for enum from another assembly\n\nIf you do not have access to enum source code directly, you can generate `enum class` for enum in external assembly.\nFor this use `[ExternalEnumClass]` attribute.\n\n```csharp\n// External assembly\nnamespace Logic;\n\npublic enum Word\n{\n    Single,\n    Double,\n    Triple\n}\n```\n\n```csharp\n// Our assembly\nusing EnumClass.Attributes;\nusing Logic;\n\n[assembly: ExternalEnumClass(typeof(Word), Namespace = \"Another\")]\nnamespace Another;\n\npublic partial class Word\n{\n    public abstract int WordsCount { get; }\n    \n    public partial class SingleEnumValue\n    {\n        public override int WordsCount =\u003e 1;    \n    }\n    \n    \n    public partial class DoubleEnumValue\n    {\n        public override int WordsCount =\u003e 2;    \n    }\n    \n    \n    public partial class TripleEnumValue\n    {\n        public override int WordsCount =\u003e 3;    \n    }\n}\n```\n\n## Known limitations\n\n### Same name of member and enum\n\nIn the current implementation, static enum class field names have the same names as members of the original enum.\n\nE.g.\n```csharp\n[EnumClass]\npublic enum TokenType\n{\n    TokenType\n}\n```\n\nwill generate approximately the following code\n\n```csharp\npublic class TokenType\n{\n    public static TokenTypeEnumValue TokenType = new();\n}\n```\n\n### Half-baked\n\nThe project at an early stage of life. \nI'm sure there are lots of hidden bugs, so be cautious using it in production.\nIn production may be better for now to use [SmartEnum](https://github.com/ardalis/SmartEnum)\n\n## Contributing\n\nIf you have an idea on how to improve the project or have found a bug, \ncreate an issue on [GitHub](https://github.com/ashenBlade/EnumClass/issues)\n\n## Give a star\n\nIf you want to see the continuation of the project, give it a star!\n","funding_links":[],"categories":["Content","Source Generators"],"sub_categories":["38. [EnumClass](https://ignatandrei.github.io/RSCG_Examples/v2/docs/EnumClass) , in the [Enum](https://ignatandrei.github.io/RSCG_Examples/v2/docs/rscg-examples#enum) category","Enums"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FashenBlade%2FEnumClass","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FashenBlade%2FEnumClass","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FashenBlade%2FEnumClass/lists"}