使用枚举类(而不是枚举类型)

提示

此内容摘自电子书《适用于容器化 .NET 应用程序的 .NET 微服务体系结构》,可在 .NET 文档上获取,也可作为免费可下载的 PDF 脱机阅读。

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

枚举(或枚举类型)是围绕整型类型的精简语言包装器 。 建议在存储一组封闭值中的一个值时,限制对它们的使用。 基于大小(小、中、大)的分类是一个很好的示例。 对控制流或更强健的抽象使用枚举可成为代码气味。 这种使用方式会使代码很脆弱,并且会使许多控制流语句检查枚举值。

相反,你可以创建枚举类,启动面向对象语言的所有丰富功能。

但这不是关键点,在许多情况下,为了简便起见,如果喜欢,仍然可以使用常规枚举类型。 枚举类的使用与业务相关的概念更密切。

实现枚举基类

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

其他资源