2010-02-03 1 views
0

그래서 System.ComponentModel.DataAnnotations 네임 스페이스를 열심히 모델에 추가했습니다. 같은DataGrid 도우미를 만들 때 Reflection을 사용하여 새 데이터 어노테이션 속성에 어떻게 액세스합니까?

내가 추가 한 것 :

[Required] [DisplayName("First Name")] 
public string first_name {get;set;} 

은 정말 이러한 특성처럼 그들은 사용자 정의 T4 쓰기 및/또는 무겁게 전망을 수정할 필요에서 저를 저장하기 때문이다. 이렇게하면 원하는 표시 이름을 추가 할 수 있다고 확신하는 뷰를 다시 생성 할 수 있습니다.

ASP.NET MVC2에서 영감을 얻은 DataGrid 도우미를 만들 때 문제가 발생합니다.

이 도우미에서 Stephen은 리플렉션을 사용하여 열 제목을 가져옵니다.

var value=typeOf(T).GetProperty(columnName).GetValue(item,null) ?? String.Empty; 

글쎄, 문제는 내가 속성 이름을 검색하고 싶지 않다는 것입니다. DisplayName 특성 값을 검색하고 싶습니다.

이것에 대한 첫 번째 시도는 PropertyInfo 클래스의 Attributes 속성을 살펴 보는 것입니다. 아쉽게도 데이터 주석 중 하나도 속성으로 표시되지 않습니다.

리플렉션을 사용하여 데이터 어노테이션을 검색하는 방법이 있습니까?

감사합니다,

답변

0
var attributes = (DisplayNameAttribute[])typeof(T) 
    .GetProperty(columnName) 
    .GetCustomAttributes(typeof(DisplayNameAttribute), true); 

// TODO: check for null and array size 
var displayName = attributes[0].DisplayName; 
0
public static void BuildGrid<T>(IEnumerable<T> items) 
    {    
     var metadataTypes = typeof(T).GetCustomAttributes(typeof(MetadataTypeAttribute), true); 
     if (metadataTypes.Any()) 
     { 
      foreach (var metaProp in (metadataTypes[0] as MetadataTypeAttribute).MetadataClassType.GetProperties()) 
      { 
       var objProp = typeof(T).GetProperties().Single(x => x.Name == metaProp.Name); 
       var displayNames = metaProp.GetCustomAttributes(typeof (DisplayNameAttribute), true); 
       if (displayNames.Any()) 
       { 
        var displayName = (displayNames[0] as DisplayNameAttribute).DisplayName;       
        foreach (var item in items) 
         var value = objProp.GetValue(item, null);        
       } 
      }     
     } 
    } 
관련 문제