构建数据网格助手时,如何使用Reflection访问新的数据注释属性?

时间:2010-02-03 08:18:14

标签: asp.net html asp.net-mvc reflection helpers

所以我急切地将System.ComponentModel.DataAnnotations命名空间添加到我的模型中。

我添加了诸如以下内容:

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

我非常喜欢这些属性,因为它们使我不必编写自定义T4和/或大量修改视图。这样,我可以重新生成一个视图,确信它将添加我想要的显示名称等等。

当我开始构建一个受ASP.NET MVC2释放启发的DataGrid助手时,问题出现了。

在这个助手中,斯蒂芬使用反射来获得列标题。

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

好吧,麻烦的是我不想检索属性名称。我想检索DisplayName属性的值。

我的第一次尝试是查看PropertyInfo类的Attributes属性。不幸的是,没有任何数据注释显示为属性。

有没有办法使用反射检索数据注释?

谢谢,

罗恩

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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);                            
                }
            }                
        }
    }