2017-12-11 1 views
0

열거 형의 사용과 비트 [Flags]를 결합하여 결과의 ​​조합에 대한 설명을 사용하고자합니다. Flags 속성을 사용하고 설명 속성을 사용하여 예제를 살펴 보았지만 둘 다 사용하지는 않았습니다. 같은[Description]과 [Flags]를 사용하는 C#

뭔가 :

[Flags] 
public enum ReasonCode 
{ 
    [Description("Verified")] 
    None = 0, 
    [Description("Check A")] 
    Reason1 = 1, 
    [Description("Check B")] 
    Reason2 = 2, 
    [Description("Check C")] 
    Reason3 = 4, 
    [Description("Check D")] 
    Reason4 = 8, 
    [Description("Check E")] 
    Reason5 = 16, 
    [Description("Check F")] 
    Reason6 = 32, 
    [Description("Check G")] 
    Reason7 = 64 
} 

나는 실패가 왜 모든 이유를 지정해야합니다. "Reason1"등을 사용하면 내가 찾고있는 것을 충분히 설명 할 수 없습니다. "Reason1 - Check A"와 같은 훨씬 자세한 설명이 필요합니다. 예

:

(5)의 값과 Reason1 Reason3 것이다.
설명은 다음과 같다 :

실패 :
Reason1이 - A.
Reason3 확인 - C.

가되어 있는지 확인이 플래그 같은 설명을 결합 할 수 있습니까? 당신이 사용하는 다음 코드 찾고있는 결과를 생성하기 위해

+1

** ** ** ** ** ** ** 아마 내 의견이지만 : ** 유지 보수성과 확장 성을 위해 "오류 메시지"를'속성'으로 사용해서는 안됩니다. 대신 오류 코드에서 오류 설명으로의 맵핑을 수행하는 클래스를 작성하고 팩토리에서 해당 클래스의 인스턴스를 인터페이스 또는 추상 기본 클래스의 형식으로 리턴 할 수 있습니다. 이 방법으로 변경 사항이 단일 클래스 (또는 다른 클래스에서 상속받은 클래스)에 포함되어있는 동안 메시지 (및 해당 소스 (나중에 파일 또는 데이터베이스에서로드하려는 경우)를 항상 변경할 수 있습니다. –

+0

@CodeNotFound 그것은 내 질문을 해결했다. 고맙습니다. – jdroke

답변

0

:

public static String GetDescription(ReasonCode reasonCode) 
{ 
    if (reasonCode == ReasonCode.None) 
     return "Verified"; 

    StringBuilder sb = new StringBuilder(); 
    sb.AppendLine("Failed:"); 

    foreach (ReasonCode rc in Enum.GetValues(typeof(ReasonCode)).Cast<ReasonCode>()) 
    { 
     if (rc == ReasonCode.None) 
      continue; 

     if (reasonCode.HasFlag(rc)) 
      sb.AppendLine(rc.ToString() + " - " + GetEnumDescription(rc)); 
    } 

    return sb.ToString(); 
} 
설명 값을 검색하는 데 사용되는 코드는 this 구현을 기반으로

:

public static String GetEnumDescription(Enum value) 
{ 
    String valueText = value.ToString(); 
    Type type = value.GetType(); 

    FieldInfo fi = type.GetField(valueText); 
    Object[] attributes = fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

    if (attributes.Length > 0) 
    { 
     DescriptionAttribute attribute = (DescriptionAttribute)attributes[0]; 
     return attribute.Description; 
    } 

    return valueText; 
} 

당신이 할 수있는 실용적인 데모를 찾으십시오 here.

+1

도움 주셔서 감사합니다! 이것은 내가 찾고 있었던 바로 그 것이었다. – jdroke

+0

여러분을 환영합니다! –