How to iterate through all Model Display attribute values โ€‹โ€‹(Name =)

I found that @RichTebb code is great and it returns the DisplayName attribute.

But how to iterate over all the values โ€‹โ€‹of the Model Display attribute (Name =), then?

Thanks for ANY key!

@RichTebb Code

public static class HelperReflectionExtensions { public static string GetPropertyDisplayString<T>(Expression<Func<T, object>> propertyExpression) { var memberInfo = GetPropertyInformation(propertyExpression.Body); if (memberInfo == null) { throw new ArgumentException( "No property reference expression was found.", "propertyExpression"); } var displayAttribute = memberInfo.GetAttribute<DisplayAttribute>(false); if (displayAttribute != null) { return displayAttribute.Name; } // ReSharper disable RedundantIfElseBlock else // ReSharper restore RedundantIfElseBlock { var displayNameAttribute = memberInfo.GetAttribute<DisplayNameAttribute>(false); if (displayNameAttribute != null) { return displayNameAttribute.DisplayName; } // ReSharper disable RedundantIfElseBlock else // ReSharper restore RedundantIfElseBlock { return memberInfo.Name; } } } public static MemberInfo GetPropertyInformation(Expression propertyExpression) { Debug.Assert(propertyExpression != null, "propertyExpression != null"); var memberExpr = propertyExpression as MemberExpression; if (memberExpr == null) { var unaryExpr = propertyExpression as UnaryExpression; if (unaryExpr != null && unaryExpr.NodeType == ExpressionType.Convert) { memberExpr = unaryExpr.Operand as MemberExpression; } } if (memberExpr != null && memberExpr.Member.MemberType == MemberTypes.Property) { return memberExpr.Member; } return null; } public static T GetAttribute<T>(this MemberInfo member, bool isRequired) where T : Attribute { var attribute = member.GetCustomAttributes(typeof(T), false).SingleOrDefault(); if (attribute == null && isRequired) { throw new ArgumentException( string.Format( CultureInfo.InvariantCulture, "The {0} attribute must be defined on member {1}", typeof(T).Name, member.Name)); } return (T)attribute; } } 

Example:

 string displayName = ReflectionExtensions.GetPropertyDisplayName<SomeClass>(i => i.SomeProperty); 

enter image description here

+1
reflection c # asp.net-mvc
Oct 13
source share
2 answers

3 hours and I found a solution.

Primarily

  [Display(Name = "Employed: ")] public Nullable<bool> Employed { get; set; } 

and

  [DisplayName("Employed: ")] public Nullable<bool> Employed { get; set; } 

don't match. :) For MVC, we should use this syntax [DisplayName("Employed: ")]

Also, the class metadata attribute should look like

 [MetadataType(typeof(PatientMetadata))] public partial class Patient { .... internal sealed class PatientMetadata { 

And finally, CODE

  public static class DisplayNameHelper { public static string GetDisplayName(object obj, string propertyName) { if (obj == null) return null; return GetDisplayName(obj.GetType(), propertyName); } public static string GetDisplayName(Type type, string propertyName) { var property = type.GetProperty(propertyName); if (property == null) return null; return GetDisplayName(property); } public static string GetDisplayName(PropertyInfo property) { var attrName = GetAttributeDisplayName(property); if (!string.IsNullOrEmpty(attrName)) return attrName; var metaName = GetMetaDisplayName(property); if (!string.IsNullOrEmpty(metaName)) return metaName; return property.Name.ToString(CultureInfo.InvariantCulture); } private static string GetAttributeDisplayName(PropertyInfo property) { var atts = property.GetCustomAttributes( typeof(DisplayNameAttribute), true); if (atts.Length == 0) return null; var displayNameAttribute = atts[0] as DisplayNameAttribute; return displayNameAttribute != null ? displayNameAttribute.DisplayName : null; } private static string GetMetaDisplayName(PropertyInfo property) { if (property.DeclaringType != null) { var atts = property.DeclaringType.GetCustomAttributes( typeof(MetadataTypeAttribute), true); if (atts.Length == 0) return null; var metaAttr = atts[0] as MetadataTypeAttribute; if (metaAttr != null) { var metaProperty = metaAttr.MetadataClassType.GetProperty(property.Name); return metaProperty == null ? null : GetAttributeDisplayName(metaProperty); } } return null; } } 

How to use:

 var t = patient.GetType(); foreach (var pi in t.GetProperties()) { var dn = DisplayNameHelper.GetDisplayName(pi); } 

DONE !!!!

+7
Oct 13
source share
  Type t = model.GetType(); foreach (PropertyInfo pi in t.GetProperties()) { var attr = pi.GetCustomAttribute(DisplayNameAttribute, true); if (attr != null) ... } 
0
Oct 13
source share



All Articles