다음을 통해 공유


열거형 형식 대신 열거형 클래스 사용

팁 (조언)

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.

컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로서비스 아키텍처 eBook의 표지 썸네일.

열거형(또는 열거형 타입)은 정수형을 둘러싼 얇은 언어 래퍼입니다. 닫힌 값 집합에서 하나의 값을 저장하는 경우 사용을 제한할 수 있습니다. 크기(소형, 중형, 대형)를 기준으로 분류하는 것이 좋은 예입니다. 제어 흐름 또는 보다 강력한 추상화에 열거형을 사용하는 것은 코드 냄새일 수 있습니다. 이러한 유형의 사용은 열거형의 값을 확인하는 많은 제어 흐름 문이 있는 취약한 코드로 이어집니다.

대신 개체 지향 언어의 모든 풍부한 기능을 사용하도록 설정하는 열거형 클래스를 만들 수 있습니다.

그러나 이 항목은 중요한 항목이 아니며 대부분의 경우 단순성을 위해 기본 설정인 경우 일반 열거형 형식 을 계속 사용할 수 있습니다. 열거형 클래스의 사용은 비즈니스 관련 개념과 더 관련이 있습니다.

열거형 기본 클래스 구현

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

이 클래스는 다음과 같이 엔터티 또는 값 개체의 형식으로 사용할 수 있습니다 CardTypeEnumeration .

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

추가 리소스