2011-11-11 5 views
2

ケース管理システムの対応するフィールドに列挙型をマップするために使用する独自のエンティティ属性で、自分の列挙型をマークしています。アトリビュートからenumを作成する

列挙型の値から正しい文字列を取得すると問題はありませんが、文字列から列挙型を生成するにはどうすればよいですか?

私はこのことによって開始:

foreach (var fieldInfo in enumType.GetFields()) 
{ 
    var attribute = (EntityNameAttribute)fieldInfo 
     .GetCustomAttributes(typeof (EntityNameAttribute), false) 
     .FirstOrDefault(); 

    if (attribute == null) 
     continue; 

    if (attribute.Name != name) 
     continue; 

    //got a match. But now what? 
} 

をしかし、どのように、私は、フィールドから適切な値を得るのですか? fieldInfo.GetValueを使用できますか?もしそうなら、私はどのようなインスタンスを使うべきですか?列挙型は静的型として扱われるべきですか?

+0

* "generate enum by string" *の意味を理解できませんでした。 '' Red "=> Color.Red'と言いたいのですか? –

+0

@MunimAbdul:他のシステムでは、状態は "01 - Planning"と名前を付けることができます。これは、私のenumのフィールドとして '[EntityName(" 01 - Planning ")] Planning = 1、 – jgauffin

答えて

5

はい、あなたは使用することができます。

object value = fieldInfo.GetValue(null); 

彼らは効果的に、静的な読み取り専用フィールドです。そのではありません。文字列から列挙型を取得していますが、の場合はにする必要があります。Enum.Parseを使用できます。

一つのことに注意する - あなたは.NET 3.5を使用している場合は、あなたの全体のコードは、LINQを簡素化することができます。

var values = from field in enumType.GetFields() 
      from EntityNameAttribute attribute in 
        field.GetCustomAttributes((typeof(EntityNameAttribute), false) 
      where attribute.Name == name 
      select field.GetValue(null); 

(それはが定義された右のタイプの複数の属性が存在する場合と仮定します、あなたは1つが右の名前があり、一つだけは、右の名前を持っているであろう気にしない)

+0

doh!私は今、かなり馬鹿だと感じています。 – jgauffin

+0

@jgauffin:全く馬鹿だと感じる必要はありません。完璧に合理的な質問:) –

+0

+1私が欲しいものを書いた...だけで、より簡潔で有益かつエレガントなファッション.. –

1

はい、それは静的な型として扱うことができます。

string enumString = fieldInfo.GetValue(null).ToString(); 

は役に立ちます