가치에서 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);
enum
C # 의 기본 기본 데이터 형식은 int
입니다. 캐스팅 만하면됩니다.
최신 정보
구속되지 않은 멜로디 라이브러리는 더 이상 유지되지 않습니다. Enums.NET 에 대한 지원이 중단되었습니다 .
Enums.NET에서는 다음을 사용합니다.
string description = ((MyEnum)value).AsString(EnumFormat.Description);
원본 게시물
Unconstrained Melody 에서 일반적인 형식 안전 방식으로 이것을 구현했습니다 .
string description = Enums.GetDescription((MyEnum)value);
이:
- 값이 실제로 열거 형 값인지 (일반 형식 제약 조건으로) 보장
- 현재 솔루션에서 권투를 피하십시오
- 모든 통화에서 리플렉션 사용을 피하기 위해 모든 설명을 캐시
- 설명에서 값을 구문 분석하는 기능을 포함하여 다른 많은 방법이 있습니다.
핵심 답변은 int
to 에서 캐스트 된 것임을 알고 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
'Programing' 카테고리의 다른 글
CMake가 'configure --prefix = DIR && make all install'과 동등한 것은 무엇입니까? (0) | 2020.02.29 |
---|---|
Ajax를 사용하여 데이터와 파일을 모두 한 형태로 업로드 하시겠습니까? (0) | 2020.02.29 |
루트가 아닌 프로세스가 Linux의 "권한있는"포트에 바인딩 할 수있는 방법이 있습니까? (0) | 2020.02.29 |
줄 끝에 줄 번호와 적중 횟수를 표시하도록 grep 출력을 어떻게 형식화 할 수 있습니까? (0) | 2020.02.29 |
CMake 출력을 지우는 'cmake clean'명령 찾기 (0) | 2020.02.29 |