[C# NuGet] C# SmartEnum 이란?

참조


SmartEnum 이란?

  • SmartEnum 은 C# enum에 대한 형식 안전 객체 지향 대안의 구현입니다.

SmartEnum 설치

  • C# 프로젝트에서 SmartEnum 을 설치하려면 NuGet Package를 설치하면 됩니다.
Install-Package Ardalis.SmartEnum


SmartEnum 사용법

  • SmartEnum에서 상속하여 스마트 열거를 정의합니다.여기서 Tenum은 선언할 유형입니다
using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum>
{
    public static readonly TestEnum One = new TestEnum(nameof(One), 1);
    public static readonly TestEnum Two = new TestEnum(nameof(Two), 2);
    public static readonly TestEnum Three = new TestEnum(nameof(Three), 3);

    private TestEnum(string name, int value) : base(name, value)
    {
    }
}

  • 기본값 유형은 int이지만 두 번째 일반 인수 TValue를 사용하여 설정할 수 있습니다.
  • 문자열 별칭을 명시적으로 설정할 수도 있습니다. (여기서 공백이 허용됩니다.)

using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum, ushort>
{
    public static readonly TestEnum One = new TestEnum("A string!", 1);
    public static readonly TestEnum Two = new TestEnum("Another string!", 2);
    public static readonly TestEnum Three = new TestEnum("Yet another string!", 3);

    private TestEnum(string name, ushort value) : base(name, value)
    {
    }
}

  • 일반 열거형과 마찬가지로 동일한 값에 두 개 이상의 문자열을 할당할 수 있지만 문자열에는 하나의 값만 할당할 수 있습니다.
using Ardalis.SmartEnum;

public sealed class TestEnum : SmartEnum<TestEnum>
{
    public static readonly TestEnum One = new TestEnum(nameof(One), 1);
    public static readonly TestEnum Two = new TestEnum(nameof(Two), 2);
    public static readonly TestEnum Three = new TestEnum(nameof(Three), 3);
    public static readonly TestEnum AnotherThree = new TestEnum(nameof(AnotherThree), 3);
    // public static TestEnum Three = new TestEnum(nameof(Three), 4); -> throws exception

    private TestEnum(string name, int value) : base(name, value)
    {
    }
}

SmartEnum 사용 예제

  • 그럼 실제 위의 내용을 토대로 SmartEnum을 사용한 예제코드를 작성해 보도록 하겠습니다.
using Ardalis.SmartEnum;
using System;

namespace interfaceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // FruitEnum List 출력하기
            foreach (var fruit in FruitEnum.List)
            {
                Console.WriteLine($"{fruit}");
            }

            // Enum Count 구하기
            int count = FruitEnum.List.Count;
            Console.WriteLine($"FruitEnum Count : {count} 개 입니다.");

            // Name 속성과 문자열 접근하기
            var myEnum = FruitEnum.FromName("Mango");
            Console.WriteLine($"FromName : {myEnum}");

            // Enum 존재 유무
            if(FruitEnum.TryFromName("Orange", out var outEnum))
            {
                Console.WriteLine($"FromName : {outEnum}");
            }
            else
            {
                Console.WriteLine($"없는 Name입니다.");
            }

            // 값을 일치시켜 열거형 객체에 접근하기
            var myEnumValue = FruitEnum.FromValue(3);
            Console.WriteLine($"FromValue : {myEnumValue}");

            // ToString() 메서드
            Console.WriteLine($"{FruitEnum.Apple}");
            Console.WriteLine($"{FruitEnum.Tomato}");
            Console.WriteLine($"{FruitEnum.Mango}");

            // Switch 문
            FruitEnum fruitEnum = FruitEnum.Mango;
            switch (fruitEnum.Name)
            {
                case nameof(FruitEnum.Apple):
                    Console.WriteLine("나는 사과");
                    break;
                case nameof(FruitEnum.Orange):
                    Console.WriteLine("나는 오렌지");
                    break;
                case nameof(FruitEnum.Tomato):
                    Console.WriteLine("나는 토마토");
                    break;
                case nameof(FruitEnum.Mango):
                    Console.WriteLine("나는 망고");
                    break;
                default:
                    Console.WriteLine("모르는 과일입니다.");
                    break;
            }

            // Switcha 문 패턴일치 사용
            switch(fruitEnum)
            {
                case var e when e.Equals(FruitEnum.Apple):
                    Console.WriteLine("나는 사과");
                    break;
                case var e when e.Equals(FruitEnum.Orange):
                    Console.WriteLine("나는 오렌지");
                    break;
                case var e when e.Equals(FruitEnum.Tomato):
                    Console.WriteLine("나는 토마토");
                    break;
                case var e when e.Equals(FruitEnum.Mango):
                    Console.WriteLine("나는 망고");
                    break;
            }
        }
    }

    public sealed class FruitEnum : SmartEnum<FruitEnum>
    {
        public static readonly FruitEnum Apple = new(nameof(Apple), 1);
        public static readonly FruitEnum Orange = new(nameof(Orange), 2);
        public static readonly FruitEnum Tomato = new(nameof(Tomato), 3);
        public static readonly FruitEnum Mango = new(nameof(Mango), 3);

        private FruitEnum(string name, int value) : base(name, value)
        {
        }
    }
}

실행 결과

  • SmartEnum 을 이용하면 보다 유연하고 더 다양한 방법으로 Enum 을 사용할 수 있습니다.
  • 이 외에도, 많은 기능들을 제공하기 때문에 필요에 따라서 직접 찾아서 활용하시면 되겠습니다.
    Apple
    Mango
    Orange
    Tomato
    FruitEnum Count : 4 개 입니다.
    FromName : Mango
    FromName : Orange
    FromValue : Mango
    Apple
    Tomato
    Mango
    나는 망고
    나는 토마토
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY