所以我急切地将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属性。不幸的是,没有任何数据注释显示为属性。
有没有办法使用反射检索数据注释?
谢谢,
罗恩
答案 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);
}
}
}
}