Programing

가치에서 C # 열거 형 설명을 얻는 방법은 무엇입니까?

lottogame 2020. 2. 29. 13:36
반응형

가치에서 C # 열거 형 설명을 얻는 방법은 무엇입니까? [복제]


가능한 중복 :
Enum 값의 속성 가져 오기

설명 속성이 다음과 같은 열거 형이 있습니다.

public enum MyEnum
{
    Name1 = 1,
    [Description("Here is another")]
    HereIsAnother = 2,
    [Description("Last one")]
    LastOne = 3
}

Enum을 기반으로 설명을 검색하기위한이 코드를 찾았습니다.

public static string GetEnumDescription(Enum value)
{
    FieldInfo fi = value.GetType().GetField(value.ToString());

    DescriptionAttribute[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

    if (attributes != null && attributes.Any())
    {
        return attributes.First().Description;
    }

    return value.ToString();
}

이를 통해 다음과 같은 코드를 작성할 수 있습니다.

var myEnumDescriptions = from MyEnum n in Enum.GetValues(typeof(MyEnum))
                         select new { ID = (int)n, Name = Enumerations.GetEnumDescription(n) };

열거 형 값 (예 : 1)을 알고 있다면 어떻게해야합니까? 설명을 어떻게 검색 할 수 있습니까? 즉, GetDescription 메서드에 전달하기 위해 정수를 "Enum value"로 변환하려면 어떻게해야합니까?


int value = 1;
string description = Enumerations.GetEnumDescription((MyEnum)value);

enumC # 의 기본 기본 데이터 형식은 int입니다. 캐스팅 만하면됩니다.


최신 정보

구속되지 않은 멜로디 라이브러리는 더 이상 유지되지 않습니다. Enums.NET 에 대한 지원이 중단되었습니다 .

Enums.NET에서는 다음을 사용합니다.

string description = ((MyEnum)value).AsString(EnumFormat.Description);

원본 게시물

Unconstrained Melody 에서 일반적인 형식 안전 방식으로 이것을 구현했습니다 .

string description = Enums.GetDescription((MyEnum)value);

이:

  • 값이 실제로 열거 형 값인지 (일반 형식 제약 조건으로) 보장
  • 현재 솔루션에서 권투를 피하십시오
  • 모든 통화에서 리플렉션 사용을 피하기 위해 모든 설명을 캐시
  • 설명에서 값을 구문 분석하는 기능을 포함하여 다른 많은 방법이 있습니다.

핵심 답변은 intto 에서 캐스트 된 것임을 알고 MyEnum있지만 많은 열거 작업을 수행하는 경우 Unconstrained Melody 사용에 대해 생각할 가치가 있습니다. :)


허용 된 답변의 코드를 일반 확장 방법으로 묶어서 모든 종류의 객체에 사용할 수 있습니다.

public static string DescriptionAttr<T>(this T source)
{
    FieldInfo fi = source.GetType().GetField(source.ToString());

    DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute), false);

    if (attributes != null && attributes.Length > 0) return attributes[0].Description;
    else return source.ToString();
}

원래 게시물과 같은 열거 형 또는 Description 속성으로 속성이 장식 된 다른 클래스를 사용하면 코드를 다음과 같이 사용할 수 있습니다.

string enumDesc = MyEnum.HereIsAnother.DescriptionAttr();
string classDesc = myInstance.SomeProperty.DescriptionAttr();

이것을 사용하기 쉽도록 일반적인 확장을 작성했습니다.

public static string ToDescription<TEnum>(this TEnum EnumValue) where TEnum : struct
{
    return Enumerations.GetEnumDescription((Enum)(object)((TEnum)EnumValue));
}

이제 쓸 수 있습니다 :

        MyEnum my = MyEnum.HereIsAnother;
        string description = my.ToDescription();
        System.Diagnostics.Debug.Print(description);

참고 : 위의 "계산"을 클래스 이름으로 바꾸십시오.


일반적인 방법으로는 쉽게 수행 할 수 없습니다. 정수를 특정 유형의 열거 형으로 만 변환 할 수 있습니다. Nicholas가 보여 주듯이, 이것은 한 종류의 열거 형에만 관심이 있다면 사소한 캐스트이지만 다른 종류의 열거 형을 처리 할 수있는 일반적인 방법을 작성하려는 경우 상황이 조금 더 복잡해집니다. 다음과 같은 방법으로 방법을 원합니다.

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)((TEnum)value));  // error!
}

그러나 이로 인해 "int를 TEnum으로 변환 할 수 없습니다"라는 컴파일러 오류가 발생합니다 (이 문제를 해결하면 "TEnum을 Enum으로 변환 할 수 없습니다"). 따라서 객체에 캐스트를 삽입하여 컴파일러를 속 여야합니다.

public static string GetEnumDescription<TEnum>(int value)
{
  return GetEnumDescription((Enum)(object)((TEnum)(object)value));  // ugly, but works
}

이제 열거 형의 유형에 대한 설명을 얻기 위해 이것을 호출 할 수 있습니다.

GetEnumDescription<MyEnum>(1);
GetEnumDescription<YourEnum>(2);

참고 URL : https://stackoverflow.com/questions/2650080/how-to-get-c-sharp-enum-description-from-value



반응형