즐겁게 개발을...

개발보다 게임이 더 많이 올라오는 것 같은...

개발/C#

[2022.11] Enum Display name옵션으로 처리하는 방법

다물칸 2022. 11. 7. 19:04
728x90
반응형

 

 

[2021.05] Enum을 Combobox에 값을 넣을 때 Foreach 문 활용방법

자주 사용하는 구문인데 맨날 기억이 나지 않아 예전 소스를 찾아 헤매는 것을 방지하기 위해 간단하지만 올립니다. foreach (string item in Enum.GetNames(typeof(PRODUCT_CATEGORY))) { cboProduct.Properties.Items.Add(it

endev.tistory.com

요거의 확장 개념입니다. 위처럼 처리할 경우 상수를 그대로 표시하기 때문에 보기 좋지 않죠. 

DevExpress의 콤보박스의 경우 CustomDisplayText라는 이벤트를 통해 처리하는 것도 있는데 이 방법은 그 방법을 통하지 않는 일반적인 방식을 설명드리고자 합니다. 

 

제가 사용하는 스킨 상수를 가지고 설명드립니다. 

public enum SKINNAME
{
    [Display(Name = "Light Blue")]
    BLUE_LIGHT_SKIN = 0,
    [Display(Name = "Light Green")]
    GREEN_LIGHT_SKIN = 1,
    [Display(Name = "Dark Blue")]
    BLUE_DARK_SKIN = 2,
    [Display(Name = "Dark Gray")]
    DARK_GRAY_SKIN = 3,
}

표시 하고자 하는 것을 위처럼 [] 속성으로 선언합니다. 

아래 클래스를 어딘가에 추가합니다. 

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;

// 출처: https://stackoverflow.com/questions/13099834/how-to-get-the-display-name-attribute-of-an-enum-member-via-mvc-razor-code
public static class EnumHelper<T>
    where T : struct, Enum // This constraint requires C# 7.3 or later.
{
    public static IList<T> GetValues(Enum value)
    {
        var enumValues = new List<T>();

        foreach (FieldInfo fi in value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public))
        {
            enumValues.Add((T)Enum.Parse(value.GetType(), fi.Name, false));
        }
        return enumValues;
    }

    public static T Parse(string value)
    {
        return (T)Enum.Parse(typeof(T), value, true);
    }

    public static IList<string> GetNames(Enum value)
    {
        return value.GetType().GetFields(BindingFlags.Static | BindingFlags.Public).Select(fi => fi.Name).ToList();
    }

    public static IList<string> GetDisplayValues(Enum value)
    {
        return GetNames(value).Select(obj => GetDisplayValue(Parse(obj))).ToList();
    }

    private static string lookupResource(Type resourceManagerProvider, string resourceKey)
    {
        var resourceKeyProperty = resourceManagerProvider.GetProperty(resourceKey,
            BindingFlags.Static | BindingFlags.Public, null, typeof(string),
            new Type[0], null);
        if (resourceKeyProperty != null)
        {
            return (string)resourceKeyProperty.GetMethod.Invoke(null, null);
        }

        return resourceKey; // Fallback with the key name
    }

    public static string GetDisplayValue(T value)
    {
        var fieldInfo = value.GetType().GetField(value.ToString());

        var descriptionAttributes = fieldInfo.GetCustomAttributes(
            typeof(DisplayAttribute), false) as DisplayAttribute[];

        if (descriptionAttributes[0].ResourceType != null)
            return lookupResource(descriptionAttributes[0].ResourceType, descriptionAttributes[0].Name);

        if (descriptionAttributes == null) return string.Empty;
        return (descriptionAttributes.Length > 0) ? descriptionAttributes[0].Name : value.ToString();
    }
}

 

스킨목록을 ComboxEdit (DevExpress 컴포넌트)에 넣어볼께요. 

 

foreach (string value in EnumHelper<SKINNAME>.GetDisplayValues(SKINNAME.BLUE_LIGHT_SKIN))
{
    cboSkin.Properties.Items.Add(value);
}

요런식으로 처리하면 됩니다. 

 

반응형