При создании помощника сетки данных, как получить доступ к новым атрибутам аннотации данных с помощью Reflection? - PullRequest
0 голосов
/ 03 февраля 2010

Итак, я с радостью добавил пространство имен System.ComponentModel.DataAnnotations в свою модель.

Я добавил такие вещи, как:

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

Мне действительно нравятся эти атрибуты, потому что они избавляют меня от необходимости писать собственные T4 и / или сильно изменять представления. Таким образом, я могу восстановить представление, уверенное, что оно добавит отображаемые имена, которые я хочу, и т. Д.

Проблема возникает, когда я начал создавать помощник DataGrid, вдохновленный тем, что был запущен в ASP.NET MVC2.

В этом помощнике Стивен использует отражение, чтобы добраться до заголовков столбцов.

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

Ну, проблема в том, что я не хочу получать имя свойства. Я хочу получить значение для атрибута DisplayName.

Моей первой попыткой было заглянуть внутрь свойства Attributes класса PropertyInfo. К сожалению, ни одна из аннотаций данных не отображается как атрибут.

Есть ли способ получить аннотации данных с помощью отражения?

Спасибо

Рон

Ответы [ 2 ]

0 голосов
/ 11 августа 2010
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);                            
                }
            }                
        }
    }
0 голосов
/ 03 февраля 2010
var attributes = (DisplayNameAttribute[])typeof(T)
    .GetProperty(columnName)
    .GetCustomAttributes(typeof(DisplayNameAttribute), true);

// TODO: check for null and array size
var displayName = attributes[0].DisplayName;
...