Partager via


Utiliser des classes d’énumération au lieu des types d’énumération

Conseil / Astuce

Ce contenu est un extrait du livre électronique 'Architecture des microservices .NET pour les applications .NET conteneurisées', disponible sur .NET Docs ou en tant que PDF téléchargeable gratuitement, lisible hors ligne.

Architecture de microservices .NET pour les applications .NET conteneurisées - vignette de couverture du livre électronique.

Les énumérations (ou types d’énumération pour faire court) sont une enveloppe légère de langage autour d’un type intégral. Vous pouvez limiter leur utilisation lorsque vous stockez une valeur à partir d’un ensemble de valeurs fermé. La classification basée sur les tailles (petite, moyenne, grande) est un bon exemple. L’utilisation d’énumérations pour le flux de contrôle ou des abstractions plus robustes peut être une odeur de code. Ce type d’utilisation entraîne un code fragile avec de nombreuses instructions de flux de contrôle vérifiant les valeurs de l’énumération.

Au lieu de cela, vous pouvez créer des classes d’énumération qui activent toutes les fonctionnalités enrichies d’un langage orienté objet.

Toutefois, ce n’est pas une rubrique critique et, dans de nombreux cas, par souci de simplicité, vous pouvez toujours utiliser des types d’énumération standard si c’est votre préférence. L’utilisation de classes d’énumération est plus liée aux concepts liés à l’entreprise.

Implémenter une classe de base d’énumération

Le microservice de classement dans eShopOnContainers fournit un exemple d’implémentation de classe de base d’énumération, comme illustré dans l’exemple suivant :

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

Vous pouvez utiliser cette classe comme type dans n’importe quel objet entité ou valeur, comme pour la classe suivante 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)
    {
    }
}

Ressources supplémentaires