Get display annotation value on mvc3 server side code

后端 未结 2 1151
南方客
南方客 2021-01-14 13:17

Is there a way to get the value of an annotation in server side code? For example, I have:

public class Dummy
{
    [Display(Name = \"Foo\")]
    public stri         


        
相关标签:
2条回答
  • 2021-01-14 13:33

    Something like this?

    string displayName = GetDisplayName((Dummy x) => x.foo);
    
    // ...
    
    public static string GetDisplayName<T, U>(Expression<Func<T, U>> exp)
    {
        var me = exp.Body as MemberExpression;
        if (me == null)
            throw new ArgumentException("Must be a MemberExpression.", "exp");
    
        var attr = me.Member
                     .GetCustomAttributes(typeof(DisplayAttribute), false)
                     .Cast<DisplayAttribute>()
                     .SingleOrDefault();
    
        return (attr != null) ? attr.Name : me.Member.Name;
    }
    

    Or, if you want to be able to call the method against an instance and take advantage of type inference:

    var dummy = new Dummy();
    string displayName = dummy.GetDisplayName(x => x.foo);
    
    // ...
    
    public static string GetDisplayName<T, U>(this T src, Expression<Func<T, U>> exp)
    {
        var me = exp.Body as MemberExpression;
        if (me == null)
            throw new ArgumentException("Must be a MemberExpression.", "exp");
    
        var attr = me.Member
                     .GetCustomAttributes(typeof(DisplayAttribute), false)
                     .Cast<DisplayAttribute>()
                     .SingleOrDefault();
    
        return (attr != null) ? attr.Name : me.Member.Name;
    }
    
    0 讨论(0)
  • 2021-01-14 13:52

    You will need to use reflection. Here is a sample console program that does what you want.

    class Program
    {
        static void Main(string[] args)
        {
            Dummy dummy = new Dummy();
            PropertyInfo[] properties = dummy.GetType().GetProperties();
            foreach (PropertyInfo property in properties)
            {
                IEnumerable<DisplayAttribute> displayAttributes = property.GetCustomAttributes(typeof(DisplayAttribute), false).Cast<DisplayAttribute>();
                foreach (DisplayAttribute displayAttribute in displayAttributes)
                {
                    Console.WriteLine("Property {0} has display name {1}", property.Name, displayAttribute.Name);
                }
            }
            Console.ReadLine();
        }
    }
    
    public class Dummy
    {
        [Display(Name = "Foo")]
        public string foo { get; set; }
    
        [Display(Name = "Bar")]
        public string bar { get; set; }
    }
    

    This would produce the following result:

    http://www.codetunnel.com/content/images/reflectresult.jpg

    0 讨论(0)
提交回复
热议问题