LoginSignup
27
27

More than 5 years have passed since last update.

.NET の Enum に対する不満をいろいろ解消してくれるライブラリ Enums.NET

Last updated at Posted at 2018-04-16

enum への不満

.NET の enum のパフォーマンスに対する記事を目にする機会は多いと思います。(追記あり

他にもジェネリクス関係で IEquatable<T>, IComparable<T> を実装してないとか、HasFlag の制約が甘いとか、Enum.GetValuestypeof がいちいち面倒臭いなどなど…。

Enums.NET

そんなときふとこんなライブラリを発見しました。その名も Enums.NET

どんな機能があるかは github のデモ を見ればおおよそわかると思いますが、何点か特徴をあげます。

  • Enums.GetMembers<T>() で値と名称をまとめて foreach できる。
  • HasAllFlags<T>(), HasAnyFlags<T>(), RemoveFlags<T>() 等のフラグ操作。
  • キャッシュをもつことによる高速化 alt 引用元






…皆さんお気づきだろうか?

あれ!? Enum ってジェネリクスの制約につかえなくね?(追記あり

public static void Hoge<T>(this T @this)
  where T : Enum  // コンパイルエラー
{
}

しかし、実は C# でできないだけで、MSIL 等で記述すれば可能なのです。
C# のジェネリックで Enum/Delegate 制約を使う - 捨てられたブログ

Enums.NET では Fody.ExtraConstraints を使って制約を付加しています。
いつも Fody.PropertyChanged のお世話になっていて MSIL の件も知っていたのに、こんな発想は1ミリも出てこなかった…。世のエンジニアの方々には脱帽するほかありません。


追記1

@mak_in さんより C# 7.3 にて Enum と Delegate が制約に使えることを教えていただきました。
まだリリース前なので、アップデートを待ちましょう。
C# 7.3 の新機能 未確認飛行 C


追記2

.NET Core 2.1 では HasFlag のパフォーマンスが上がるそうです。
Enum.HasFlag(Enum) のパフォーマンスの測定

27
27
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
27