2012-04-13 3 views
0

iは、カスタム属性、のようなものを持つ列挙型を持っている:カスタム属性を逆に解決するにはどうすればよいですか?

public enum EnumStatus 
{ 
    [CharValue('*')] 
    Empty, 

    [CharValue('A')] 
    value1, 

    [CharValue('P')] 
    value2, 
} 

「フォワード」の方法は 反射、GetCustomAttributes、そのようなを使用してカスタム属性を取得列挙値に来て、簡単なようです。

しかし、私は逆解決のいくつかの種類が欲しいです。 char値を持っている、私は動作する列挙値を持っていると思います。以下のような

何か:

public static Enum GetEnumValue(this Enum source, char value) 
{...} 

iの値パラメータとして 'A' を置けば、EnumStatus.value1を返す必要があります。

私はエスケープを延期して、余分なハッシュテーブルを作成したくありません。

ありがとうございます!

答えて

1

public static T GetEnumValue<T, TExpected>(char value) where TExpected : Attribute 
    { 
     var type = typeof(T); 

     if (type.IsEnum) 
     { 
      foreach (var field in type.GetFields()) 
      { 
       dynamic attribute = Attribute.GetCustomAttribute(field, 
        typeof(TExpected)) as TExpected; 

       if (attribute != null) 
       { 
        if (attribute.Value == value) 
        { 
         return (T)field.GetValue(null); 
        } 
       } 
      } 
     } 

     return default(T); 
    } 
を素晴らしい作品

...

0

DescriptionAttributeを使用して、次の例のように入力することをおすすめします。https://stackoverflow.com/a/4367868/905651私はここにこれを作った例から

+0

はどうもありがとうございました! 「デフォルト」の記述属性はすでに使用されています。したがって私は別の方法が必要です。しかし、おそらく私はその例を使用することができます。それは一般的である必要はありませんが、私は "一般的な"属性が必要です。 –

+0

例から私はここにこれを作った: パブリック静的T GetEnum (char値) {VARタイプ= typeof演算(T)。 CharValueAttributeとして (type.IsEnum) {foreachの(type.GetFieldsにおけるVARフィールド())場合 {var属性= Attribute.GetCustomAttribute(フィールド、 typeof演算(CharValueAttribute))。 if(属性!= null) { if(attribute.Value == value) return(T)field.GetValue(null); } } } return default(T); } –

関連する問題