我将介绍ICollection中项目的属性,并且在编译时不一定知道ICollection中的项目类型。我可以获取属性名称,但想获取DataAnnotation显示名称(如果有)。
如何在运行时找到未知类型的DataAnnotations(如果有)中定义的显示名称?
到目前为止,我有这个:
foreach (var thisSection in Report.ReportSections)
{
reportBody.Append(thisSection.ReportSectionName + Environment.NewLine);
if (thisSection.ReportItems != null)
{
var itemType = thisSection.ReportItems.GetType().GetGenericArguments().Single();
var first = true;
foreach (var prop in itemType.GetProperties())
{
if (!first) reportBody.Append(",");
// This gives me the property name like 'FirstName'
reportBody.Append(prop.Name);
try
{
// I'd like to get the Display Name from
// [Display(Name = "First Name")]
var displayName = prop.GetCustomAttributes();
}
catch (Exception e)
{
}
first = false;
}
reportBody.Append(Environment.NewLine);
}
}
ReportSection
的定义如下:
public interface IReportSection
{
string ReportSectionName { get; }
ICollection ReportItems { get; }
}
ICollection可以包含这样的对象集合:
public class ProjectAffiliateViewModel
{
public string Role { get; set; }
[Display(Name = "First Name")]
public string FirstName { get; set; }
}
对于Role
属性,我们会获得Role
,对于FirstName
属性,我们会获得First Name
。
答案 0 :(得分:4)
像这样:
DisplayAttribute attribute = prop.GetCustomAttributes(typeof(DisplayAttribute), false)
.Cast<DisplayAttribute>()
.SingleOrDefault();
string displayName = (attribute != null) ? attribute.Name : prop.Name;