[C#/WINUI3/COMMUNITY TOOLKIT/.NET8] EnumValues 확장 태그 : Type 속성을 사용해 열거형 값 컬렉션 구하기
■ EnumValues 확장 태그의 Type 속성을 사용해 열거형 값 컬렉션을 구하는 방법을 보여준다. ※ 비주얼 스튜디오에서 TestProject(Unpackaged) 모드로 빌드한다. ※ TestProject.csproj 프로젝트
■ EnumValues 확장 태그의 Type 속성을 사용해 열거형 값 컬렉션을 구하는 방법을 보여준다. ※ 비주얼 스튜디오에서 TestProject(Unpackaged) 모드로 빌드한다. ※ TestProject.csproj 프로젝트
■ Enum 클래스를 사용해 함수형 타입으로 열거형을 정의하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from enum import Enum documentType = Enum("DocumentType", "HTML CSS JAVASCRIPT") list1 = list(documentType) print(documentType) print(type(documentType)) print(list1) print(list1[0]) print(type(list1[0])) """ <enum 'DocumentType'> <class 'enum.EnumType'> [<DocumentType.HTML: 1>, <DocumentType.CSS: 2>, <DocumentType.JAVASCRIPT: 3>] DocumentType.HTML <enum 'DocumentType'> """ |
■ Enum 클래스를 사용해 열거형 값을 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from enum import Enum class DocumentType(Enum): HTML = 1 CSS = 2 JAVASCRIPT = 3 document = DocumentType document = DocumentType.HTML print(document.name ) print(document.value) """ HTML 1 """ |
■ Option<T> 열거형의 Some(T) 변형에서 T 타입의 값을 구하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 |
let option : Option<i32> = Some(10); let value : i32 = match option { Some(v) => v, None => panic!("Option is None") }; println!("{}", value); |
■ Option<T> 열거형에서 let if문을 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 |
let option : Option<i32> = Some(10); let value : i32 = if let Some(v) = option { v * 2 } else { 0 }; println!("{}", value); |
■ Box<T> 구조체에서 열거형을 사용해 단방향 연결 리스트를 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
enum Node { Empty, Cons(i64, Box<Node>) } use Node::{Empty, Cons}; fn node(data : i64, link : Box<Node>) -> Box<Node> { Box::new(Cons(data, link)) } fn main() { let first_node_box : Box<Node> = node(10, node(20, node(30, Box::new(Empty)))); let mut current_pointer : &Box<Node> = &first_node_box; loop { let current_node : &Node = &**current_pointer; match current_node { Empty => break, Cons(data, link) => { println!("{}", data); current_pointer = &link; } } } } /* 10 20 30 */ |
■ Option<T> 열거형과 match문을 사용하는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
fn print_bmi(height : f32, weight : Option<f32>) { let bmi_option : Option<f32> = match weight { Some(weight) => Some(weight / (height / 100.0).powf(2.0)), None => None }; let message_string_slice : &str = match bmi_option { Some(n) if n < 18.5 => "저체중", Some(n) if n < 23.0 => "정상", Some(n) if n < 25.0 => "비만전단계", Some(n) if n < 30.0 => "1단계 비만", Some(n) if n < 35.0 => "2단계 비만", Some(_) => "3단계 비만", None => "계산 불가" }; println!("BMI : {:.1}, 결과 : {}", bmi_option.unwrap(), message_string_slice); } fn main() { let height : f32 = 162.3; print_bmi(height, Some(48.0)); print_bmi(height, Some(72.3)); print_bmi(height, None ); } |
■ enum 키워드를 사용해 열거형을 만드는 방법을 보여준다. ▶ 예제 코드 (RS)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
enum Currency { Currency100(isize), Currency500(isize), Currency1000(isize), Currency5000(isize), Currency10000(isize), Currency50000(isize) } impl Currency { fn calculate_amount(&self) -> isize { match *self { Currency::Currency100 (value) => value * 100, Currency::Currency500 (value) => value * 500, Currency::Currency1000 (value) => value * 1000, Currency::Currency5000 (value) => value * 5000, Currency::Currency10000(value) => value * 10000, Currency::Currency50000(value) => value * 50000 } } } fn main() { let currency_vector : Vec<Currency> = vec! [ Currency::Currency100(3), Currency::Currency500(2), Currency::Currency1000(6), Currency::Currency5000(1), Currency::Currency10000(8), Currency::Currency50000(3) ]; let total_amount : isize = currency_vector.iter().fold(0, |total_amount, v| total_amount + v.calculate_amount()); println!("전체 금액 : {}", total_amount); } |
■ Enum 클래스를 사용해 플래그 조합에서 플래그 설정 여부을 구하는 방법을 보여준다. ▶ PetType.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
namespace TestProject { /// <summary> /// 애완동물 타입 /// </summary> [Flags] public enum PetType { /// <summary> /// 없음 /// </summary> None = 0, /// <summary> /// 개 /// </summary> Dog = 1, /// <summary> /// 고양이 /// </summary> Cat = 2, /// <summary> /// 새 /// </summary> Bird = 4, /// <summary> /// 토끼 /// </summary> Rabbit = 8, /// <summary> /// 기타 /// </summary> Other = 16 } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 플래그 설정 여부 구하기 - IsFlagSet(sourceType, flagType) /// <summary> /// 플래그 설정 여부 구하기 /// </summary> /// <param name="sourceType">소스 타입</param> /// <param name="flagType">플래그 타입</param> /// <returns>플래그 설정 여부</returns> private static bool IsFlagSet(PetType sourceType, PetType flagType) { return (sourceType & flagType) == flagType; } #endregion #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { PetType[] petTypeArray = { PetType.None, PetType.Dog | PetType.Cat, PetType.Dog }; int noneCount = 0; int dogCount = 0; foreach(PetType petType in petTypeArray) { if(petType.Equals(PetType.None)) { noneCount++; } else if(IsFlagSet(petType, PetType.Dog)) { dogCount++; } } Console.WriteLine("애완동물이 없는 경우 : {0}/{1}", noneCount, petTypeArray.Length); Console.WriteLine("개가 있는 경우 : {0}/{1}", dogCount , petTypeArray.Length); } #endregion } |
TestProject.zip
■ Enum 클래스의 HasFlag 메소드를 사용해 플래그 조합에서 플래그 설정 여부를 구하는 방법을 보여준다. ▶ PetType.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
namespace TestProject { /// <summary> /// 애완동물 타입 /// </summary> [Flags] public enum PetType { /// <summary> /// 없음 /// </summary> None = 0, /// <summary> /// 개 /// </summary> Dog = 1, /// <summary> /// 고양이 /// </summary> Cat = 2, /// <summary> /// 새 /// </summary> Bird = 4, /// <summary> /// 토끼 /// </summary> Rabbit = 8, /// <summary> /// 기타 /// </summary> Other = 16 } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { PetType[] petTypeArray = { PetType.None, PetType.Dog | PetType.Cat, PetType.Dog }; int noneCount = 0; int dogCount = 0; foreach(PetType petType in petTypeArray) { if(petType.Equals(PetType.None)) { noneCount++; } else if(petType.HasFlag(PetType.Dog)) { dogCount++; } } Console.WriteLine("애완동물이 없는 경우 : {0}/{1}", noneCount, petTypeArray.Length); Console.WriteLine("개가 있는 경우 : {0}/{1}", dogCount , petTypeArray.Length); } #endregion } |
TestProject.zip
■ Enum 클래스의 ToObject 정적 메소드를 사용해 정수 값으로 열거형을 구하는 방법을 보여준다. ▶ Enum 클래스 : ToObject 정적 메소드를 사용해 정수
■ EnumToIntConverter 클래스에서 열거형 값 ↔ 정수 변환자를 사용하는 방법을 보여준다. ▶ OSTYpe.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace TestProject; /// <summary> /// OS 타입 /// </summary> public enum OSType { /// <summary> /// 안드로이드 /// </summary> Android, /// <summary> /// iOS /// </summary> iOS, /// <summary> /// 맥 OS /// </summary> macOS, /// <summary> /// 타이젠 /// </summary> Tizen, /// <summary> /// 윈도우즈 /// </summary> Windows } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> <Label x:Name="label" HorizontalOptions="Center" VerticalOptions="Center" FontSize="24" /> </ContentPage> |
▶ MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
using CommunityToolkit.Maui.Converters; namespace TestProject; /// <summary> /// 메인 페이지 /// </summary> public partial class MainPage : ContentPage { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 선택 값 - SelectedValue /// <summary> /// 선택 값 /// </summary> public OSType SelectedValue { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainPage() /// <summary> /// 생성자 /// </summary> public MainPage() { InitializeComponent(); SelectedValue = OSType.iOS; EnumToIntConverter converter = new EnumToIntConverter(); this.label.SetBinding ( Label.TextProperty, new Binding("SelectedValue", converter : converter) ); BindingContext = this; } #endregion } |
▶ MauiProgram.cs
■ EnumToIntConverter 엘리먼트에서 열거형 값 ↔ 정수 변환자를 사용하는 방법을 보여준다. ▶ OSTYpe.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace TestProject; /// <summary> /// OS 타입 /// </summary> public enum OSType { /// <summary> /// 안드로이드 /// </summary> Android, /// <summary> /// iOS /// </summary> iOS, /// <summary> /// 맥 OS /// </summary> macOS, /// <summary> /// 타이젠 /// </summary> Tizen, /// <summary> /// 윈도우즈 /// </summary> Windows } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"> <ContentPage.Resources> <toolkit:EnumToIntConverter x:Key="EnumToIntConverterKey" /> </ContentPage.Resources> <Label HorizontalOptions="Center" VerticalOptions="Center" FontSize="24" Text="{Binding SelectedValue, Converter={StaticResource EnumToIntConverterKey}}" /> </ContentPage> |
▶ MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
namespace TestProject; /// <summary> /// 메인 페이지 /// </summary> public partial class MainPage : ContentPage { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 선택 값 - SelectedValue /// <summary> /// 선택 값 /// </summary> public OSType SelectedValue { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainPage() /// <summary> /// 생성자 /// </summary> public MainPage() { InitializeComponent(); SelectedValue = OSType.iOS; BindingContext = this; } #endregion } |
▶ MauiProgram.cs
■ EnumToBoolConverter 클래스에서 열거형 값 → 진리 값 변환자를 사용하는 방법을 보여준다. ▶ OSTYpe.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace TestProject; /// <summary> /// OS 타입 /// </summary> public enum OSType { /// <summary> /// 안드로이드 /// </summary> Android, /// <summary> /// iOS /// </summary> iOS, /// <summary> /// 맥 OS /// </summary> macOS, /// <summary> /// 타이젠 /// </summary> Tizen, /// <summary> /// 윈도우즈 /// </summary> Windows } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"> <StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label x:Name="label1" HorizontalOptions="Center" FontSize="20" Text="안드로이드 또는 iOS 운영체제 입니다." /> <Label x:Name="label2" HorizontalOptions="Center" FontSize="20" Text="타이젠 또는 윈도우즈 운영체제 입니다." /> </StackLayout> </ContentPage> |
▶ MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
using CommunityToolkit.Maui.Converters; namespace TestProject; /// <summary> /// 메인 페이지 /// </summary> public partial class MainPage : ContentPage { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 선택 값 - SelectedValue /// <summary> /// 선택 값 /// </summary> public OSType SelectedValue { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainPage() /// <summary> /// 생성자 /// </summary> public MainPage() { InitializeComponent(); SelectedValue = OSType.iOS; EnumToBoolConverter converter1 = new EnumToBoolConverter(); converter1.TrueValues.Add(OSType.Android); converter1.TrueValues.Add(OSType.iOS ); this.label1.SetBinding ( Label.IsVisibleProperty, new Binding("SelectedValue", converter : converter1) ); EnumToBoolConverter converter2 = new EnumToBoolConverter(); converter2.TrueValues.Add(OSType.Tizen ); converter2.TrueValues.Add(OSType.Windows); this.label2.SetBinding ( Label.IsVisibleProperty, new Binding("SelectedValue", converter : converter2) ); BindingContext = this; } #endregion } |
▶
■ EnumToBoolConverter 엘리먼트에서 열거형 값 → 진리 값 변환자를 사용하는 방법을 보여준다. ▶ OSTYpe.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
namespace TestProject; /// <summary> /// OS 타입 /// </summary> public enum OSType { /// <summary> /// 안드로이드 /// </summary> Android, /// <summary> /// iOS /// </summary> iOS, /// <summary> /// 맥 OS /// </summary> macOS, /// <summary> /// 타이젠 /// </summary> Tizen, /// <summary> /// 윈도우즈 /// </summary> Windows } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:local="clr-namespace:TestProject"> <ContentPage.Resources> <toolkit:EnumToBoolConverter x:Key="EnumToBoolConverterKey1"> <toolkit:EnumToBoolConverter.TrueValues> <local:OSType>Android</local:OSType> <local:OSType>iOS</local:OSType> </toolkit:EnumToBoolConverter.TrueValues> </toolkit:EnumToBoolConverter> <toolkit:EnumToBoolConverter x:Key="EnumToBoolConverterKey2"> <toolkit:EnumToBoolConverter.TrueValues> <local:OSType>Tizen</local:OSType> <local:OSType>Windows</local:OSType> </toolkit:EnumToBoolConverter.TrueValues> </toolkit:EnumToBoolConverter> </ContentPage.Resources> <StackLayout HorizontalOptions="Center" VerticalOptions="Center"> <Label HorizontalOptions="Center" FontSize="20" Text="안드로이드 또는 iOS 운영체제 입니다." IsVisible="{Binding SelectedValue, Converter={StaticResource EnumToBoolConverterKey1}}" /> <Label HorizontalOptions="Center" FontSize="20" Text="타이젠 또는 윈도우즈 운영체제 입니다." IsVisible="{Binding SelectedValue, Converter={StaticResource EnumToBoolConverterKey2}}" /> </StackLayout> </ContentPage> |
※ EnumToBoolConverter.TrueValues 속성에서 열거형
■ Enum 클래스의 TryParse 정적 메소드를 사용해 문자열로 열거형 값을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
bool ignoreCase = true; bool result = Enum.TryParse("green", ignoreCase , out Color color); if(result) { Console.WriteLine(color); } else { Console.WriteLine("파싱할 수 없습니다."); } |
■ Enum 클래스의 Parse<T> 정적 메소드를 사용해 문자열로 열거형 값을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 |
Color color = Enum.Parse<Color>("Green"); Console.WriteLine(color); |
■ Enum 클래스의 Parse 정적 메소드를 사용해 문자열로 열거형 값을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 |
public enum Color { Red, Green, Blue }; Color color = (Color)Enum.Parse(typeof(Color), "Green"); // 대소문자를 구분한다. Console.WriteLine(color); |
■ 열거형 최대값을 구하는 방법을 보여준다. ▶ 열거형 최대값 구하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; /// <summary> /// 숫자 /// </summary> public enum Number { One, Two, Three } Number number = GetMaximumValue<Number>(); Console.WriteLine(number); |
▶ 열거형 최대값 구하기 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Linq; #region 최대값 구하기 - GetMaximumValue<TEnum>() /// <summary> /// 최대값 구하기 /// </summary> /// <typeparam name="TEnum">열거형 타입</typeparam> /// <returns>최대값</returns> public TEnum GetMaximumValue<TEnum>() where TEnum : Enum { return Enum.GetValues(typeof(TEnum)).Cast<TEnum>().Max(); } #endregion |
■ XAML에서 플래그 열거형을 사용하는 방법을 보여준다. ▶ 예제 코드 (XAML)
1 2 3 |
<Glyphs StyleSimulations="BoldItalicSimulation,ItalicSimulation" /> |
■ 열거형을 정렬하는 방법을 보여준다. ▶ EnumerationTypeConverter.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
using System; using System.ComponentModel; using System.Globalization; using System.Linq; namespace TestProject { /// <summary> /// 열거형 타입 변환자 /// </summary> public class EnumerationTypeConverter : EnumConverter { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - EnumerationTypeConverter(enumerationType) /// <summary> /// 생성자 /// </summary> /// <param name="enumerationType">열거형 타입</param> public EnumerationTypeConverter(Type enumerationType) : base(enumerationType) { } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 변환하기 - ConvertTo(context, cultureInfo, value, targetType) /// <summary> /// 변환하기 /// </summary> /// <param name="context">타입 설명자 컨텍스트</param> /// <param name="cultureInfo">문화 정보</param> /// <param name="value">값</param> /// <param name="targetType">타겟 타입</param> /// <returns>설명</returns> public override object ConvertTo(ITypeDescriptorContext context, CultureInfo cultureInfo, object value, Type targetType) { if(targetType == typeof(string) && value != null) { Type enumerationType = value.GetType(); if(enumerationType.IsEnum) { return GetDescription(value); } } return base.ConvertTo(context, cultureInfo, value, targetType); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 설명 구하기 - GetDescription(value) /// <summary> /// 설명 구하기 /// </summary> /// <param name="value">값</param> /// <returns>설명</returns> private object GetDescription(object value) { DescriptionAttribute attribute = EnumType.GetField(value.ToString()) .GetCustomAttributes(typeof(DescriptionAttribute), false) .FirstOrDefault() as DescriptionAttribute; if(attribute != null) { return attribute.Description; } return Enum.GetName(EnumType, value); } #endregion } } |
▶ Country.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
using System.ComponentModel; namespace TestProject { /// <summary> /// 국가 /// </summary> [TypeConverter(typeof(EnumerationTypeConverter))] public enum Country : int { /// <summary> /// 호주 /// </summary> [Description("호주 (AUS)")] AUS = 0, /// <summary> /// 미국 /// </summary> [Description("미국 (USA)")] USA = 1, /// <summary> /// 영국 /// </summary> [Description("영국 (GBR)")] GBR = 2, /// <summary> /// 프랑스 /// </summary> [Description("프랑스 (FRA)")] FRA = 3, /// <summary> /// 독일 /// </summary> [Description("독일 (GER)")] GER = 4, /// <summary> /// 스페인 /// </summary> [Description("스페인 (ESP)")] ESP = 5, /// <summary> /// 자메이카 /// </summary> [Description("자메이카 (JAM)")] JAM = 6, /// <summary> /// 한국 /// </summary> [Description("한국 (KOR)")] KOR = 7, /// <summary> /// 우루과이 /// </summary> [Description("우루과이 (URU)")] URU = 8 } } |
▶ EnumerationHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; namespace TestProject { /// <summary> /// 열거형 헬퍼 /// </summary> public class EnumerationHelper { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 값으로 정렬하기 - SortByValue<TItem>(sourceList) /// <summary> /// 값으로 정렬하기 /// </summary> /// <typeparam name="TItem">항목 타입</typeparam> /// <param name="sourceList">소스 리스트</param> /// <returns>값 정렬 리스트</returns> public static List<TItem> SortByValue<TItem>(List<TItem> sourceList) { List<string> itemList = new List<string>(); List<TItem> targetList = new List<TItem>(); foreach(TItem source in sourceList) { itemList.Add(source.ToString()); } itemList.Sort(); foreach(string item in itemList) { targetList.Add((TItem)Enum.Parse(typeof(TItem), item)); } return targetList; } #endregion #region 설명으로 정렬하기 - SortByDescription<TItem>(sourceList) /// <summary> /// 설명으로 정렬하기 /// </summary> /// <typeparam name="TItem">항목 타입</typeparam> /// <param name="sourceList">소스 리스트</param> /// <returns>설명 정렬 리스트</returns> public static List<TItem> SortByDescription<TItem>(List<TItem> sourceList) { List<string> itemList = new List<string>(); List<TItem> targetList = new List<TItem>(); foreach(TItem source in sourceList) { itemList.Add(GetDescriptionFromValue<TItem>(source)); } itemList.Sort(); foreach(string item in itemList) { targetList.Add(GetValueFromDescription<TItem>(item)); } return targetList; } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 값에서 설명 구하기 - GetDescriptionFromValue<TItem>(value) /// <summary> /// 값에서 설명 구하기 /// </summary> /// <typeparam name="TItem">항목 타입</typeparam> /// <param name="value">값</param> /// <returns>설명</returns> private static string GetDescriptionFromValue<TItem>(TItem value) { DescriptionAttribute attribute = value.GetType() .GetField(value.ToString()) .GetCustomAttributes(typeof(DescriptionAttribute), false) .SingleOrDefault() as DescriptionAttribute; return attribute == null ? value.ToString() : attribute.Description; } #endregion #region 설명에서 값 구하기 - GetValueFromDescription<TItem>(description) /// <summary> /// 설명에서 값 구하기 /// </summary> /// <typeparam name="TItem">항목 타입</typeparam> /// <param name="description">설명</param> /// <returns>값</returns> private static TItem GetValueFromDescription<TItem>(string description) { Type type = typeof(TItem); if(!type.IsEnum) { throw new ArgumentException(); } FieldInfo[] fieldInfoArray = type.GetFields(); var attributeInfo = fieldInfoArray.SelectMany ( f => f.GetCustomAttributes(typeof(DescriptionAttribute), false), (f, a) => new { Field = f, Attribute = a } ) .Where(a => ((DescriptionAttribute)a.Attribute).Description == description) .SingleOrDefault(); return attributeInfo == null ? default(TItem) : (TItem)attributeInfo.Field.GetRawConstantValue(); } #endregion } } |
▶ MainWindow.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<Window x:Class="TestProject.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="800" Height="600" Title="열거형 정렬하기" Background="#426aa1" FontFamily="나눔고딕코딩" FontSize="16"> <Grid> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <Label HorizontalAlignment="Left"> 열거형 값으로 정렬 : </Label> <ComboBox Width="300" Height="25" IsEditable="False" ItemsSource="{Binding Path=DefaultCountryList}" /> <Label HorizontalAlignment="Left" Margin="0 10 0 0"> 국가 코드로 정렬 : </Label> <ComboBox Width="300" Height="25" IsEditable="False" ItemsSource="{Binding Path=CountryListSortedByValue}" /> <Label HorizontalAlignment="Left" Margin="0 10 0 0"> 국가명으로 정렬 : </Label> <ComboBox Width="300" Height="25" IsEditable="False" ItemsSource="{Binding Path=CountryListSortedByDescription}" /> </StackPanel> </Grid> </Window> |
▶ MainWindow.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
using System; using System.Collections.Generic; using System.Linq; using System.Windows; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public partial class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 디폴트 국가 리스트 - DefaultCountryList /// <summary> /// 디폴트 국가 리스트 /// </summary> public List<Country> DefaultCountryList { get; set; } #endregion #region 값으로 정렬 국가 리스트 - CountryListSortedByValue /// <summary> /// 값으로 정렬 국가 리스트 /// </summary> public List<Country> CountryListSortedByValue { get; set; } #endregion #region 설명으로 정렬 국가 리스트 - CountryListSortedByDescription /// <summary> /// 설명으로 정렬 국가 리스트 /// </summary> public List<Country> CountryListSortedByDescription { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { InitializeComponent(); SetList(); DataContext = this; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 리스트 설정하기 - SetList() /// <summary> /// 리스트 설정하기 /// </summary> private void SetList() { List<Country> defaultCountryList = Enum.GetValues(typeof(Country)).Cast<Country>().ToList(); DefaultCountryList = defaultCountryList; CountryListSortedByValue = EnumerationHelper.SortByValue(defaultCountryList); CountryListSortedByDescription = EnumerationHelper.SortByDescription<Country>(defaultCountryList); } #endregion } } |
TestProject.zip
■ Enum 클래스의 GetNames 정적 메소드를 사용해 열거형 크기를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 |
using System; int enumerationCount = Enum.GetNames(typeof(System.Windows.Forms.DockStyle)).Length; Console.WriteLine(enumerationCount); |
■ Enum 클래스의 GetValues 정적 메소드를 사용해 최대 열거형 값을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 |
using System; using System.Linq; using System.Windows.Forms; DockStyle lastDockStyle = Enum.GetValues(typeof(DockStyle)).Cast<DockStyle>().Max(); Console.WriteLine(lastDockStyle); |
■ 열거형으로 비트마스크를 사용하는 방법을 보여준다. ▶ DayType.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
using System; namespace TestProject { /// <summary> /// 요일 타입 /// </summary> [Flags] public enum DayType { /// <summary> /// 해당 무 /// </summary> None = 0, /// <summary> /// 일요일 (1) /// </summary> Sunday = 1 << 0, /// <summary> /// 월요일 (2) /// </summary> Monday = 1 << 1, /// <summary> /// 화요일 (4) /// </summary> Tuesday = 1 << 2, /// <summary> /// 수요일 (8) /// </summary> Wednesday = 1 << 3, /// <summary> /// 목요일 (16) /// </summary> Thursday = 1 << 4, /// <summary> /// 금요일 (32) /// </summary> Friday = 1 << 5, /// <summary> /// 토요일 (64) /// </summary> Saturday = 1 << 6, /// <summary> /// 평일 /// </summary> Workdays = Monday | Tuesday | Wednesday | Thursday | Friday, /// <summary> /// 휴일 /// </summary> Vacationdays = Saturday | Sunday, /// <summary> /// 모든 요일 /// </summary> AllDays = Workdays | Vacationdays } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
using System; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 요일 타입 /// </summary> private static DayType _dayType = DayType.Wednesday | DayType.Friday; /// <summary> /// 화요일 포함 여부 /// </summary> private static bool _containsTuesday = (_dayType & DayType.Tuesday) == DayType.Tuesday ? true : false; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { Console.WriteLine(_containsTuesday); } #endregion } } |
TestProject.zip
■ enum 키워드를 사용해 열거형을 만드는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
enum Status { login, logout } void main() { Status status = Status.logout; switch (status) { case Status.login: print('로그인'); break; case Status.logout: print('로그아웃'); break; } } |