2011-08-12 2 views
3

서버 측 코드에서 주석 값을 가져 오는 방법이 있습니까? 예를 들어, 내가 가진 :mvc3 서버 측 코드에서 표시 주석 값 가져 오기

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

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

내가 값 "푸" 아웃 페이지로 다시 게시와 서버 측을 얻을 수 있기를 원하는하지만 클래스의 속성, 또는 뭔가처럼 그 종류. 처럼 @ 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, 매우 간결합니다. 'attattrName'에'Displayattribute'에 캐스팅하지 않고 어떻게 접근 할 수 있습니까? '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를 반복하도록 답변을 업데이트했습니다. – Chev

+0

회원은'DisplayAttribute'에'AllowMultiple = false' 주석이 달려 있기 때문에 하나 이상이 없어야합니다. – LukeH

+0

@LukeH 괜찮아요,하지만 내 코드로 가정하는 걸 싫어 해요.) – Chev

관련 문제