Search code examples
c#attributes

get the value of DisplayName attribute


public class Class1
{
    [DisplayName("Something To Name")]
    public virtual string Name { get; set; }
}

How to get the value of DisplayName attribute in C# ?


Solution

  • Try these utility methods of mine:

    using System.ComponentModel;
    using System.Globalization;
    using System.Linq;
    
    
    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;
    }
    
    public static string GetPropertyDisplayName<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 attr = memberInfo.GetAttribute<DisplayNameAttribute>(false);
        if (attr == null)
        {
            return memberInfo.Name;
        }
    
        return attr.DisplayName;
    }
    
    public static MemberInfo GetPropertyInformation(Expression propertyExpression)
    {
        Debug.Assert(propertyExpression != null, "propertyExpression != null");
        MemberExpression memberExpr = propertyExpression as MemberExpression;
        if (memberExpr == null)
        {
            UnaryExpression 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;
    }
    

    Usage would be:

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