Bagikan melalui


Menggunakan kelas enumerasi alih-alih jenis enum

Petunjuk / Saran

Konten ini adalah kutipan dari eBook, Arsitektur Layanan Mikro .NET untuk Aplikasi .NET Kontainer, tersedia di .NET Docs atau sebagai PDF gratis yang dapat diunduh yang dapat dibaca secara offline.

Arsitektur Layanan Mikro .NET untuk Aplikasi .NET Dalam Kontainer: gambar kecil sampul eBook.

Enumerasi (atau jenis enum singkatnya) adalah pembungkus bahasa tipis di sekitar jenis integral. Anda mungkin ingin membatasi penggunaannya saat menyimpan satu nilai dari sekumpulan nilai tertutup. Klasifikasi berdasarkan ukuran (kecil, sedang, besar) adalah contoh yang baik. Menggunakan enum untuk aliran kontrol atau abstraksi yang lebih kuat bisa menjadi bau kode. Jenis penggunaan ini mengarah ke kode yang rapuh dengan banyak pernyataan alur kontrol memeriksa nilai enum.

Sebagai gantinya, Anda dapat membuat kelas Enumerasi yang memungkinkan semua fitur kaya dari bahasa berorientasi objek.

Namun, ini bukan topik penting dan dalam banyak kasus, untuk kesederhanaan, Anda masih dapat menggunakan jenis enum reguler jika itu preferensi Anda. Penggunaan kelas enumerasi lebih terkait dengan konsep terkait bisnis.

Menerapkan sebuah kelas dasar Enumerasi

Layanan mikro pemesanan di eShopOnContainers menyediakan contoh implementasi kelas dasar Enumerasi, seperti yang ditunjukkan dalam contoh berikut:

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

Anda dapat menggunakan kelas ini sebagai jenis dalam entitas atau objek nilai apa pun, seperti untuk CardType kelas berikut: 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)
    {
    }
}

Sumber daya tambahan