2011-08-12 14 views
3

サーバサイドコードにアノテーションの値を取得する方法はありますか?例えば、私が持っている:mvc3サーバサイドコードの表示アノテーション値を取得

public class Dummy 
{ 
    [Display(Name = "Foo")] 
    public string foo { get; set; } 

    [Display(Name = "Bar")] 
    public string bar { get; set; } 
} 

は、私は、ページに戻ってそれを投稿して値「foo」というサーバー側でを取得することができますが、クラスの属性、または何かのようになりたいですソート。 like @ Html.LabelFor(model => model.Foo)しかし、C#のサーバーコード。

これは可能ですか?

ありがとうございます。

+1

? – sll

+0

@ Html.LabelFor(model => model.Foo)< - "Foo"を出力しませんか?代わりにDisplayNameAttributeを使用する必要があるかもしれません。 –

+0

@sllev申し訳ありませんが、私はコードの背後にあることを意味します。コントローラー内のアクション。 – AJC

答えて

5

は何か?

string displayName = GetDisplayName((Dummy x) => x.foo); 

// ... 

public static string GetDisplayName<T, U>(Expression<Func<T, U>> exp) 
{ 
    var me = exp.Body as MemberExpression; 
    if (me == null) 
     throw new ArgumentException("Must be a MemberExpression.", "exp"); 

    var attr = me.Member 
       .GetCustomAttributes(typeof(DisplayAttribute), false) 
       .Cast<DisplayAttribute>() 
       .SingleOrDefault(); 

    return (attr != null) ? attr.Name : me.Member.Name; 
} 

それとも、あなたはインスタンスに対してメソッドを呼び出すと、型推論を利用できるようにしたい場合は:あなたがC#サーバーコードの意味は何

var dummy = new Dummy(); 
string displayName = dummy.GetDisplayName(x => x.foo); 

// ... 

public static string GetDisplayName<T, U>(this T src, Expression<Func<T, U>> exp) 
{ 
    var me = exp.Body as MemberExpression; 
    if (me == null) 
     throw new ArgumentException("Must be a MemberExpression.", "exp"); 

    var attr = me.Member 
       .GetCustomAttributes(typeof(DisplayAttribute), false) 
       .Cast<DisplayAttribute>() 
       .SingleOrDefault(); 

    return (attr != null) ? attr.Name : me.Member.Name; 
} 
+0

+1、非常に簡潔です。あなたは 'Displayattribute'にそれをキャストせずに' attr.Name'にどのようにアクセスできますか? 'GetCustomAttributes(type、inherit)'は 'Object []'を返します。 – Chev

+0

最初のものは素晴らしいですが、後者のオプション 'GetDisplayName'は' dummy'インスタンス上の拡張子として現れません。 – Chev

+0

@Alex:私はそれをキャストしています: 'var attr =(DisplayAttribute)me.Member ...'。 (あるいはキャストしていましたが、明示的キャストの代わりに 'Cast ()'メソッドを使用する答えを編集しました) – LukeH

3

あなたはリフレクションを使用する必要があります。ここでは、あなたが欲しいものを実行するサンプルコンソールプログラムです。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dummy dummy = new Dummy(); 
     PropertyInfo[] properties = dummy.GetType().GetProperties(); 
     foreach (PropertyInfo property in properties) 
     { 
      IEnumerable<DisplayAttribute> displayAttributes = property.GetCustomAttributes(typeof(DisplayAttribute), false).Cast<DisplayAttribute>(); 
      foreach (DisplayAttribute displayAttribute in displayAttributes) 
      { 
       Console.WriteLine("Property {0} has display name {1}", property.Name, displayAttribute.Name); 
      } 
     } 
     Console.ReadLine(); 
    } 
} 

public class Dummy 
{ 
    [Display(Name = "Foo")] 
    public string foo { get; set; } 

    [Display(Name = "Bar")] 
    public string bar { get; set; } 
} 

これは、次のような結果を生成します:このような

http://www.codetunnel.com/content/images/reflectresult.jpg

+0

メンバーに複数のDisplayAttributesがある場合、すべてのDisplayAttributesをループするように答えを更新しました。 – Chev

+0

'DisplayAttribute'に' AllowMultiple = false'というアノテーションが付けられているため、メンバは複数のメンバを持つことはありません。 – LukeH

+0

@LukeHそれは問題ありませんが、自分のコードで前提を作るのが好きではありません; – Chev

関連する問題