StrEnum 2.0.4
Prefix Reserveddotnet add package StrEnum --version 2.0.4
NuGet\Install-Package StrEnum -Version 2.0.4
<PackageReference Include="StrEnum" Version="2.0.4" />
<PackageVersion Include="StrEnum" Version="2.0.4" />
<PackageReference Include="StrEnum" />
paket add StrEnum --version 2.0.4
#r "nuget: StrEnum, 2.0.4"
#:package StrEnum@2.0.4
#addin nuget:?package=StrEnum&version=2.0.4
#tool nuget:?package=StrEnum&version=2.0.4
StrEnum
StrEnum is a tiny library for creating string-based enums in C#. Use strings instead of integers for richer, more meaningful data while keeping type safety. Read more about when and why to use string enums in this blog post.
StrEnum targets .NET Standard 2.0 and has no external dependencies.
Ecosystem
These companion packages plug StrEnum into the rest of the .NET ecosystem:
- StrEnum.AspNetCore — bind string enums in ASP.NET Core controllers.
- StrEnum.EntityFrameworkCore — use string enums in EF Core queries and migrations.
- StrEnum.Npgsql — map string enums to native Postgres enum types via Npgsql and EF Core.
- StrEnum.Dapper — use string enums in Dapper commands and queries.
- StrEnum.System.Text.Json — JSON serialization and deserialization with System.Text.Json.
Installation
Install StrEnum via the .NET CLI:
dotnet add package StrEnum
Usage
Defining a string enum
Inherit from StringEnum<TEnum> and use Define to declare members:
public class Sport : StringEnum<Sport>
{
public static readonly Sport TrailRunning = Define("TRAIL_RUNNING");
public static readonly Sport RoadCycling = Define("ROAD_CYCLING");
}
The field name becomes the member's name; the argument to Define becomes its value.
Working with members
Members behave like a regular enum — including ToString, casting, and equality:
var sport = Sport.TrailRunning;
sport.ToString(); // "TrailRunning"
(string)sport; // "TRAIL_RUNNING"
sport == Sport.RoadCycling; // false
Parsing
Parse converts a name or value into the matching member, throwing if no match is found:
Sport.Parse("TrailRunning"); // Sport.TrailRunning
Sport.Parse("TRAIL_RUNNING"); // Sport.TrailRunning
Sport.Parse("Quidditch"); // throws ArgumentException: "Requested name or value 'Quidditch' was not found."
Pass ignoreCase: true for case-insensitive matching:
Sport.Parse("trailrunning", ignoreCase: true); // Sport.TrailRunning
Sport.Parse("trail_running", ignoreCase: true); // Sport.TrailRunning
Pass MatchBy.ValueOnly to match by value and skip member names:
Sport.Parse("TRAIL_RUNNING", matchBy: MatchBy.ValueOnly); // Sport.TrailRunning
Sport.Parse("TrailRunning", matchBy: MatchBy.ValueOnly); // throws ArgumentException
Use TryParse for the non-throwing variant:
Sport.TryParse("TrailRunning", out var trailRunning); // true, trailRunning == Sport.TrailRunning
Sport.TryParse("Quidditch", out var quidditch); // false, quidditch == null
Listing members
GetMembers returns members in declaration order:
Sport.GetMembers(); // [Sport.TrailRunning, Sport.RoadCycling]
Switch statements and expressions
Because string enum members aren't constants, use property patterns with when guards:
switch (sport)
{
case { } when sport == Sport.TrailRunning:
PutOnTrailShoes();
break;
case { } when sport == Sport.RoadCycling:
GetOnRoadBike();
break;
}
The same pattern works in switch expressions:
var sportName = sport switch
{
_ when sport == Sport.TrailRunning => "Trail Running",
_ when sport == Sport.RoadCycling => "Road Cycling",
_ => "Not yet known"
};
Adding members at runtime
Define is protected, but you can expose it through a public method to add members after the class is initialized:
public class FictionalSport : StringEnum<FictionalSport>
{
public static readonly FictionalSport Quidditch = Define("QUIDDITCH");
public static FictionalSport Add(string name, string value) => Define(value, name);
}
Both name and value must be supplied for members added this way:
var podracing = FictionalSport.Add("Podracing", "PODRACING");
(string)podracing; // "PODRACING"
FictionalSport.Parse("Podracing").ToString(); // "Podracing"
License
Copyright © 2026 Dmytro Khmara.
StrEnum is licensed under the MIT license.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (7)
Showing the top 5 NuGet packages that depend on StrEnum:
| Package | Downloads |
|---|---|
|
StrEnum.System.Text.Json
String enum support for System.Text.Json. |
|
|
StrEnum.EntityFrameworkCore
String enum support for EF Core |
|
|
StrEnum.AspNetCore
String enum support for ASP.NET Core. |
|
|
StrEnum.Dapper
String enum support for Dapper. |
|
|
ClickTime.NET
Wrapper for API @ https://developer.clicktime.com/docs/api/ |
GitHub repositories
This package is not used by any popular GitHub repositories.