如何使用EF6在Controller中的[Display(Name =“”)]属性中获取任何属性的值

时间:2015-09-27 12:55:40

标签: c# asp.net-mvc

我正在开发一个MVC 5应用程序。我希望在我的控制器方法中为任何类的任何属性获取 [Display(Name =“”)] 属性中的值。

我的模特是:

public partial class ABC
{
   [Required]
   [Display(Name = "Transaction No")]
   public string S1 { get; set; }
}

我看过answer to this question,但这是一个有点冗长的程序。我正在寻找随时可用和内置的东西。

所以,我试过这个:

MemberInfo property = typeof(ABC).GetProperty(s); // s is a string type which has the property name ... in this case it is S1
var dd = property.CustomAttributes.Select(x => x.NamedArguments.Select(y => y.TypedValue.Value)).OfType<System.ComponentModel.DataAnnotations.DisplayAttribute>();

但我有两个问题,首先我没有得到价值,即“交易否”。其次,即使我已经提到 .OfType&lt;&gt; ,我仍然获得所有属性,即[Display(Name =“”)]和[Required]。

但幸运的是我在

中获得了“交易否”值
  

性&gt;&GT; CustomAttribute&GT;&GT; [1]&GT;&GT; NamedArguments&GT;&GT; [0]&GT;&GT;的TypedValue&GT;&GT;值   =“交易否”

由于 TypedValue.Value 具有所需的值,所以我该如何检索它?

4 个答案:

答案 0 :(得分:16)

这应该有效:

UIViewControllers

答案 1 :(得分:1)

Alex Art的回答几乎对我有用。 dd.Name只返回了属性名称,但dd.GetName()返回了Display属性中的文字。

答案 2 :(得分:0)

您可以使用它:

MemberInfo property = typeof(ABC).GetProperty(s); 
var name = property.GetCustomAttribute<DisplayAttribute>()?.Name;

答案 3 :(得分:0)

为方便起见,将 Ahmed Galal's nice answer 表述为实用程序类中的静态方法:

using System.ComponentModel.DataAnnotations;
using System.Reflection;

namespace Project
{
    public static class AttributeGetter
    {
        public static string DisplayName<T>(string propertyName)
        {
            MemberInfo property = typeof(T).GetProperty(propertyName);
            return property.GetCustomAttribute<DisplayAttribute>()?.Name;
        }
    }
}

用法:

string displayName = AttributeGetter.DisplayName<VM>(nameof(VM.Prop));