[C# NuGet] C# SmartEnum 이란?
- C#/C# 문법
- 2022. 1. 15. 18:03
참조
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
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] Task 클래스를 이용한 비동기 처리 방법 (0) | 2022.01.16 |
---|---|
[C# 문법] C# 프로세스 시작하기, 끝내기, 기다리기 (0) | 2022.01.16 |
[C# NuGet] Topshelf 이란? (0) | 2022.01.11 |
[C# 문법] ConcurrentBag - 소개 및 예제 (0) | 2022.01.10 |
[C# 문법] C# 문자열 보간 이용하여 앞에 숫자 0 붙이는 방법 (0) | 2022.01.10 |
이 글을 공유하기