2016-12-15 3 views
0

Я использую asp.net MVC 5 с EntityFramework 6 DataAnnotations. Я хотел бы знать, есть ли способ получить все DisplayName объекта и сохранить их в переменной в класс контроллера.Получить все значения атрибутов DisplayName

Например, учитывая класс:

public class Class1 
{ 
    [DisplayName("The ID number")] 
    public int Id { get; set; } 

    [DisplayName("My Value")] 
    public int Value { get; set; } 

    [DisplayName("Label name to display")] 
    public string Label { get; set; } 
} 

Как получить значения DisplayName для всех атрибутов? Например, как создать функцию, которая возвращает Dictionary< string,string >, который имеет ключ с именем атрибута и значением с DisplayName, как это:

{ "Id": "The ID name", "Value": "My Value", "Label": "Label name to display"}. 

Я видел эту тему stackoverflow - get the value of DisplayName attribute, но у меня нет идей способа распространяется это код.

+0

'DisplayName' или' display' (они разные)? –

+0

@IvanStoev 'DisplayName' – Cyr

ответ

2

Если вы на самом деле не заботиться о атрибуте DisplayName, но эффективное отображаемое имя, которое будет использоваться (например, путем связывания данных), проще всего использовать TypeDescriptor.GetProperties метод:

var info = TypeDescriptor.GetProperties(typeof(Class1)) 
    .Cast<PropertyDescriptor>() 
    .ToDictionary(p => p.Name, p => p.DisplayName); 
+0

Благодарим за ответ. Я инкапсулировал ваш код для работы с Generic Class, и он продолжает работать. Вы решаете мою проблему! – Cyr

+0

@Cyr, поэтому отметьте его как ответ –

+0

Можно ли получить словарь со значениями отображаемых имен и ссылкой на саму функцию? Даже если это возможно только для статических методов. – Reiner

0

Вы можете используйте код ниже -

Class1 c = new Class1(); 
PropertyInfo[] listPI = c.GetType().GetProperties(); 
Dictionary<string, string> dictDisplayNames = new Dictionary<string, string>(); 
string displayName = string.Empty; 

foreach (PropertyInfo pi in listPI) 
{ 
    DisplayNameAttribute dp = pi.GetCustomAttributes(typeof(DisplayNameAttribute), true).Cast<DisplayNameAttribute>().SingleOrDefault(); 
      if (dp != null) 
      { 
       displayName = dp.DisplayName; 
       dictDisplayNames.Add(pi.Name, displayName); 
      } 
} 

Я также ссылался на ту же ссылку, что и вы упомянули в вопросе.

окончательный словарь, как -

enter image description here

+0

Благодарим за ответ, но, к сожалению, ваш код не работает над моим проектом. – Cyr

+0

В чем проблема? – Dhanashree

+0

Он возвращает «Последовательность не содержит элементов» в присваивании displayName в цикле foreach. – Cyr

Смежные вопросы