получить значение атрибута DisplayName - PullRequest
60 голосов
/ 16 февраля 2011
public class Class1
{
    [DisplayName("Something To Name")]
    public virtual string Name { get; set; }
}

Как получить значение атрибута DisplayName в C #?

Ответы [ 13 ]

1 голос
/ 22 января 2015

Предполагая property как PropertyInfo тип, вы можете сделать это в одной строке:

property.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().Single().DisplayName
0 голосов
/ 01 ноября 2018

Пожалуйста, попробуйте ниже код, я думаю, что это решит вашу проблему.

var classObj = new Class1();
classObj.Name => "StackOverflow";

var property = new Class1().GetType().GetProperty(nameof(classObj.Name));
var displayNameAttributeValue = (property ?? throw new InvalidOperationException())
    .GetCustomAttributes(typeof(DisplayNameAttribute)) as DisplayNameAttribute; 

if (displayNameAttributeValue != null)
{
   Console.WriteLine("{0} = {1}", displayNameAttributeValue, classObj.Name);
}
0 голосов
/ 27 февраля 2017

После ответа Рича Тебба и Мэтта Бейкера я хотел использовать методы ReflectionExtensions в запросе LINQ, но он не работал, поэтому я сделал этот метод для его работы.

Если установлено значение DisplayNameAttribute, метод вернет его, в противном случае будет возвращено имя MemberInfo.

Метод теста:

static void Main(string[] args)
{
    var lst = new List<Test>();
    lst.Add(new Test("coucou1", "kiki1"));
    lst.Add(new Test("coucou2", "kiki2"));
    lst.Add(new Test("coucou3", "kiki3"));
    lst.Add(new Test("coucou4", "kiki4"));
    lst.ForEach(i => 
        Console.WriteLine(i.GetAttributeName<Test>(t => t.Name) + ";" + i.GetAttributeName<Test>(t=>t.t2)));
}

Вывод метода теста:

Test method output

Класс с DisplayName1 Атрибут:

public class Test
{
    public Test() { }
    public Test(string name, string T2)
    {
        Name = name;
        t2 = T2;
    }
    [DisplayName("toto")]
    public string Name { get; set; }
    public string t2 { get; set; }
}

И метод расширения:

public static string GetAttributeName<T>(this T itm, Expression<Func<T, object>> propertyExpression)
{
    var memberInfo = GetPropertyInformation(propertyExpression.Body);
    if (memberInfo == null)
    {
        throw new ArgumentException(
            "No property reference expression was found.",
            "propertyExpression");
    }

    var pi = typeof(T).GetProperty(memberInfo.Name);
    var ret = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().SingleOrDefault();
    return ret != null ? ret.DisplayName : pi.Name;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...