RapidEnum

August 31, 2025 · View on GitHub

nuget Releases license test

English

RapidEnum は、C#/.NET 用の高速に動作する列挙型ユーティリティを提供するソースジェネレーターです。.NET 標準の APIよりも高速で、全てのメソッドでゼロアロケーションを達成しています。

Package - RapidEnum

PerformanceComparison

.NET 標準の API よりもかなりパフォーマンスが向上されています。またFastEnum v1.8.0よりも高速で動作します。パフォーマンス比較の詳細はこちらを参照してください。

RapidEnum はFastEnumに多大の影響を受けています。API は FastEnum に非常に似ています。素晴らしいライブラリを作成してくださったxin9leさんに感謝しています!

目次

要件

  • .NET Standard2.0 以上
  • Unity 2022.3.12f1 以上

インストール

NuGet

$ dotnet add package RapidEnum

nuget.org : RapidEnum

Unity

Package Manager から下記 git URL を追加してください。

https://github.com/hanachiru/RapidEnum.git?path=/RapidEnum.Unity/Packages/com.hanachiru.rapidenum

UPM

asmdefの設定

.asmdefを作成している場合は、Assembly Definition ReferencesRapidEnumを追加する必要があります。

使い方

基本的な使い方

対象の列挙型に[RapidEnum]属性を付けると、列挙型ユーティリティクラスが生成されます。このときpublicinternalの列挙型に対してのみ有効なので注意してください。

[RapidEnum]
public enum Weather
{
    Sun,
    Cloud,
    Rain,
    Snow
}

[RapidEnum]属性を付与した列挙型に対応する、列挙型名 + EnumExtensionsクラスに関連メソッドが定義されます。

// Sun,Cloud,Rain,Snow
IReadOnlyList<Weather> values = WeatherEnumExtensions.GetValues();

// Sun,Cloud,Rain,Snow
IReadOnlyList<string> names = WeatherEnumExtensions.GetNames();

// Rain
string name = WeatherEnumExtensions.GetName(Weather.Rain);

// Cloud
string str = Weather.Cloud.ToStringFast();

// True
bool defined = WeatherEnumExtensions.IsDefined("Sun");

// Sun
Weather parse = WeatherEnumExtensions.Parse("Sun");

// True
// Sun
bool tryParse = WeatherEnumExtensions.TryParse("Sun", out Weather value);

任意の列挙型に利用する方法

[RapidEnum]属性を列挙型に付与する以外にも、[RapidEnumWithType]属性を利用することで、任意の列挙型に対してユーティリティクラスを生成することができます。

publicinternalであるstatic partial classに対して、引数に対象の列挙型を指定した[RapidEnumWithType]属性を付与してください。このときクラス名は任意の文字列で大丈夫ですが、列挙型名 + EnumExtensionsだと分かりやすいです。

// System.DateTimeKind has Unspecified, Utc, Local
[RapidEnumWithType(typeof(DateTimeKind))]
public static partial class DateTimeKindEnumExtensions
{
}

[RapidEnum]を利用した場合と比べてパフォーマンスに差があるわけではありません。サードパーティ製のライブラリが提供する列挙型など、[RapidEnum]が付与できない場合は[RapidEnumWithType]を利用してください。

// Unspecified,Utc,Local
IReadOnlyList<DateTimeKind> values = DateTimeKindEnumExtensions.GetValues();

// Unspecified,Utc,Local
IReadOnlyList<string> names = DateTimeKindEnumExtensions.GetNames();

// Local
string name = DateTimeKindEnumExtensions.GetName(DateTimeKind.Local);

// Local
string str = DateTimeKind.Local.ToStringFast();

// True
bool defined = DateTimeKindEnumExtensions.IsDefined("Local");

// Local
DateTimeKind parse = DateTimeKindEnumExtensions.Parse("Local");

// True
// Local
bool tryParse = DateTimeKindEnumExtensions.TryParse("Local", out DateTimeKind value);

Name と Value をペアで取得する

列挙型の Name と Value をペアで取得したい場合は、GetMembersメソッドやGetMemberメソッドを利用してください。

WeatherEnumExtensions.Member member = WeatherEnumExtensions.GetMember(Weather.Rain);
var (name, value) = member;

foreach (WeatherEnumExtensions.Member item in WeatherEnumExtensions.GetMembers())
{
    Console.WriteLine($"Name : {item.Name}, Value : {item.Value}");
}

EnumMemberAttributeの値の取得

EnumMemberAttributeを利用している場合は、EnumMemberAttributeValueプロパティの値を取得することができます。

[RapidEnum]
public enum Weather
{
    [EnumMember(Value = "sun")]
    Sun,
    [EnumMember]
    Cloud,
    [EnumMember(Value = "rain")]
    Rain,
    Snow
}
// sun
string enumMemberValue = Weather.Sun.GetEnumMemberValue();

// null
string enumMemberValue = Weather.Cloud.GetEnumMemberValue();

パフォーマンス比較

MethodMeanErrorStdDevMedianGen0Allocated
RapidEnum_GetValues0.0042 ns0.0059 ns0.0052 ns0.0028 ns--
FastEnum_GetValues0.0083 ns0.0086 ns0.0081 ns0.0055 ns--
NET_GetValues64.4620 ns0.9908 ns0.9268 ns64.2767 ns0.004840 B
RapidEnum_GetNames0.0006 ns0.0017 ns0.0015 ns0.0000 ns--
FastEnum_GetNames0.0025 ns0.0031 ns0.0028 ns0.0012 ns--
NET_GetNames12.3820 ns0.1086 ns0.1016 ns12.4076 ns0.006756 B
RapidEnum_GetName0.0069 ns0.0085 ns0.0071 ns0.0039 ns--
FastEnum_GetName0.2530 ns0.0070 ns0.0065 ns0.2527 ns--
NET_GetName15.9190 ns0.0524 ns0.0490 ns15.9046 ns0.002924 B
RapidEnum_ToString0.0103 ns0.0049 ns0.0046 ns0.0110 ns--
FastEnum_ToString0.4844 ns0.0062 ns0.0052 ns0.4845 ns--
NET_ToString6.1700 ns0.0451 ns0.0376 ns6.1493 ns0.002924 B
RapidEnum_IsDefines0.0026 ns0.0036 ns0.0034 ns0.0000 ns--
FastEnum_IsDefines4.6724 ns0.0583 ns0.0545 ns4.6434 ns--
NET_IsDefines14.5923 ns0.0355 ns0.0332 ns14.5996 ns--
RapidEnum_Parse0.9258 ns0.0161 ns0.0150 ns0.9240 ns--
FastEnum_Parse4.6223 ns0.0082 ns0.0073 ns4.6192 ns--
NET_Parse8.8707 ns0.0965 ns0.0903 ns8.8293 ns--
RapidEnum_TryParse0.7633 ns0.0097 ns0.0090 ns0.7657 ns--
FastEnum_TryParse4.6869 ns0.0254 ns0.0212 ns4.6852 ns--
NET_TryParse8.8433 ns0.0609 ns0.0569 ns8.8268 ns--

PerformanceComparison

Benchmark Source

BenchmarkDotNet v0.14.0, macOS Sonoma 14.4.1 (23E224) [Darwin 23.4.0]
Apple M2 Pro, 1 CPU, 12 logical and 12 physical cores
.NET SDK 8.0.303
[Host]     : .NET 8.0.7 (8.0.724.31311), Arm64 RyuJIT AdvSIMD
DefaultJob : .NET 8.0.7 (8.0.724.31311), Arm64 RyuJIT AdvSIMD