次の方法で共有


enum 型の代わりに Enumeration クラスを使用する

ヒント

このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。

コンテナー化された .NET アプリケーションの .NET マイクロサービス アーキテクチャの電子ブックの表紙サムネイル。

列挙型 (短く言えば enum型) は、整数型を囲む薄い言語ラッパーです。 閉じた値のセットから 1 つの値を格納する場合に、それらの使用を制限することができます。 サイズ (小、中、大) に基づく分類が良い例です。 制御フローまたはより堅牢な抽象化のために列挙型を使用すると、コードの臭いになることがあります。 この種の使用法は、列挙型の値をチェックする制御フロー ステートメントが多数存在する脆弱なコードにつながります。

代わりに、オブジェクト指向言語のすべての豊富な機能を有効にする列挙クラスを作成できます。

ただし、これは重要なトピックではありません。多くの場合、わかりやすくするために、通常の 列挙型 が好みの場合は引き続き使用できます。 列挙クラスの使用は、ビジネス関連の概念に関連しています。

列挙型の基本クラスを実装する

eShopOnContainers の注文マイクロサービスは、次の例に示すように、列挙型基底クラスの実装のサンプルを提供します。

public abstract class Enumeration : IComparable
{
    public string Name { get; private set; }

    public int Id { get; private set; }

    protected Enumeration(int id, string name) => (Id, Name) = (id, name);

    public override string ToString() => Name;

    public static IEnumerable<T> GetAll<T>() where T : Enumeration =>
        typeof(T).GetFields(BindingFlags.Public |
                            BindingFlags.Static |
                            BindingFlags.DeclaredOnly)
                 .Select(f => f.GetValue(null))
                 .Cast<T>();

    public override bool Equals(object obj)
    {
        if (obj is not Enumeration otherValue)
        {
            return false;
        }

        var typeMatches = GetType().Equals(obj.GetType());
        var valueMatches = Id.Equals(otherValue.Id);

        return typeMatches && valueMatches;
    }

    public int CompareTo(object other) => Id.CompareTo(((Enumeration)other).Id);

    // Other utility methods ...
}

このクラスは、次の CardType : Enumeration クラスのように、任意のエンティティまたは値オブジェクトの型として使用できます。

public class CardType
    : Enumeration
{
    public static CardType Amex = new(1, nameof(Amex));
    public static CardType Visa = new(2, nameof(Visa));
    public static CardType MasterCard = new(3, nameof(MasterCard));

    public CardType(int id, string name)
        : base(id, name)
    {
    }
}

その他のリソース