Sdílet prostřednictvím


Použití tříd výčtu místo typů výčtu

Tip

Tento obsah je výňatek z eBooku, architektury mikroslužeb .NET pro kontejnerizované aplikace .NET, které jsou k dispozici na .NET Docs nebo jako zdarma ke stažení PDF, které lze číst offline.

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

Výčty (nebo typy výčtu pro krátké) jsou tenkou obálkou jazyka kolem celočíselného typu. Při ukládání jedné hodnoty z uzavřené sady hodnot můžete chtít jejich použití omezit. Dobrým příkladem je klasifikace založená na velikostech (malá, střední, velká). Použití výčtů pro tok řízení nebo robustnější abstrakce může být zápach kódu. Tento typ použití vede k křehkému kódu s mnoha příkazy toku řízení, které kontrolují hodnoty výčtu.

Místo toho můžete vytvořit třídy výčtu, které umožňují všechny bohaté funkce objektově orientovaného jazyka.

Nejedná se ale o kritické téma a v mnoha případech pro jednoduchost můžete i nadále používat běžné typy výčtů, pokud je to vaše preference. Použití tříd výčtu souvisí s koncepty souvisejícími s obchodními činnostmi.

Implementace základní třídy výčtu

Mikroslužba objednávání v eShopOnContainers poskytuje ukázkovou implementaci základní třídy výčtu, jak je znázorněno v následujícím příkladu:

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 ...
}

Tuto třídu můžete použít jako typ v libovolném objektu entity nebo hodnoty, jako pro následující CardType : třída: 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)
    {
    }
}

Další materiály