2016-12-15 126 views
0

私はasp.net MVC 5とEntityFramework 6 DataAnnotationsを使用しています。 オブジェクトのすべてをDisplayNameに取得し、それらを変数でControllerクラスに保存する方法があるかどうかを知りたいと思います。DisplayName属性のすべての値を取得

例えば、クラスを考慮:

public class Class1 
{ 
    [DisplayName("The ID number")] 
    public int Id { get; set; } 

    [DisplayName("My Value")] 
    public int Value { get; set; } 

    [DisplayName("Label name to display")] 
    public string Label { get; set; } 
} 

すべての属性のDisplayNameの値を取得する方法は?

{ "Id": "The ID name", "Value": "My Value", "Label": "Label name to display"}. 

私はこのトピックstackoverflow - get the value of DisplayName attributeを見てきましたが、私はこれを拡張する方法のないアイデアを持っていません:たとえば、次のように、DisplayNameを持つ属性の名前と値を持つキーを持っているDictionary< string,string >を返す関数を作成する方法コード。

+0

'DisplayName'または' Display'(それらが異なりますか)? –

+0

@IvanStoev 'DisplayName' – Cyr

答えて

2

あなたは本当にDisplayName属性について気にしませんが、(データバインディングによって例えば)に使用される有効表示名は、最も簡単にはTypeDescriptor.GetPropertiesメソッドを使用する場合:

var info = TypeDescriptor.GetProperties(typeof(Class1)) 
    .Cast<PropertyDescriptor>() 
    .ToDictionary(p => p.Name, p => p.DisplayName); 
+0

ありがとうございました。私はジェネリッククラスで作業するためのコードをカプセル化しており、それは動作し続けます。あなたは私の問題を解決する! – Cyr

+0

@Cyrだから、答えとしてマークしてください –

+0

表示名の値と関数自体への参照で辞書を取得できますか?これが静的メソッドに対してのみ可能であっても。 – Reiner

0

することができますが以下のコードを使用してください -

Class1 c = new Class1(); 
PropertyInfo[] listPI = c.GetType().GetProperties(); 
Dictionary<string, string> dictDisplayNames = new Dictionary<string, string>(); 
string displayName = string.Empty; 

foreach (PropertyInfo pi in listPI) 
{ 
    DisplayNameAttribute dp = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().SingleOrDefault(); 
      if (dp != null) 
      { 
       displayName = dp.DisplayName; 
       dictDisplayNames.Add(pi.Name, displayName); 
      } 
} 

私もあなたが質問に記載したのと同じリンクを参照しています。

最終辞書があるとして -

enter image description here

+0

ありがとうございます。残念ながら、あなたのコードは私のプロジェクトでは動作しません。 – Cyr

+0

問題は何ですか? – Dhanashree

+0

foreachループにdisplayNameを代入すると、「シーケンスに要素がありません」という結果が返されます。 – Cyr

関連する問題