共用方式為


使用列舉類別,而不是列舉型別

小提示

此內容是適用於容器化 .NET 應用程式的電子書.NET 微服務架構摘錄,可在 .NET Docs 或免費下載的 PDF 中取得,可脫機讀取。

.NET 微服務架構的容器化 .NET 應用程式電子書封面縮圖。

枚舉型(或簡稱為枚舉型)是整數型別的精簡語言封裝。 當您從一組封閉的值中儲存一個值時,您可能會想要將其使用限制為 。 以大小(小、中、大)為基礎的分類是一個很好的例子。 使用枚舉來控制流程或更強固的抽象概念可能是一種程式異味。 這種類型的使用方式會導致具有許多控制流程語句檢查列舉值的脆弱程序代碼。

相反地,您可以建立列舉類別,以啟用面向對象語言的所有豐富功能。

不過,這不是重要的主題,在許多情況下,為了簡單起見,如果您偏好的話,您仍然可以使用一般 列舉類型 。 列舉類別的使用與商務相關概念更相關。

實現列舉基礎類別

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)
    {
    }
}

其他資源