2017-12-11 18 views
0

列挙型の使用とビット単位の[Flags]を組み合わせて、結果の組み合わせの説明を使用しています。ここでは、Flags属性を使用し、説明属性を使用した例を見てきましたが、両方ではありません。私は障害が発生した理由すべての理由を指定する必要が[説明]で[Flags]を使用する

[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

あなたは大歓迎です! –

関連する問題