在mvc3服务器端代码上获取显示注释值

AJC*_*AJC 3 c# annotations asp.net-mvc-3

有没有办法在服务器端代码中获取注释的值?例如,我有:

public class Dummy
{
    [Display(Name = "Foo")]
    public string foo { get; set; }

    [Display(Name = "Bar")]
    public string bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在服务器端获得值"Foo"而不将其发布回页面,但是像类的属性或类似的东西.就像@Html.LabelFor(model => model.Foo)但是在c#服务器代码中.

那可能吗?

谢谢.

Luk*_*keH 5

像这样的东西?

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;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望能够针对实例调用该方法并利用类型推断:

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;
}
Run Code Online (Sandbox Code Playgroud)