Использование отражения для получения списка DisplayNames из свойств класса
Я пытаюсь получить список DisplayNames из класса, который имеет большинство его свойств логических:
public class AccessoriesModel
{
public int Id { get; set; }
[Display(Name = "Acc 1")]
public bool Accessory1 { get; set; }
[Display(Name = "Acc 2")]
public bool Accessory2 { get; set; }
[Display(Name = "Acc 3")]
public bool Accessory3 { get; set; }
[Display(Name = "Acc 4")]
public bool Accessory4 { get; set; }
}
перебирая PropertyInfos класса и просматривая, какие значения являются истинными, как показано ниже:
List<string> list = new List<string>();
foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
{
if (propertyInfo.PropertyType == typeof(bool))
{
bool value = (bool)propertyInfo.GetValue(data, null);
if (value)
{
//add the DisplayName of the item who's value is true to the list named "list"
//the following line works fine, but I cannot iterate over the list of items to get dinamicaly build the list
string displayName = GetPropertyDisplayName<AccessoriesModel>(i => i.AirConditioning);
list.add(displayName)
}
}
}
где GetPropertyDisplayName - это решение, предложенное другим участником в его ответе на другой вопрос для получения DisplayName свойства: /questions/11743604/poluchit-znachenie-atributa-displayname/11743613#11743613
Конечный результат, который я ищу, - это список строк (отображаемых имен), которые будут сформированы только из свойств, которые являются истинными.
Заранее благодарю за помощь в этом.
1 ответ
Я думаю, что вы используете неправильный атрибут. Я просто взял фрагмент с /questions/11743604/poluchit-znachenie-atributa-displayname/11743605#11743605 и заменил "DisplayNameAttribute" на "DisplayAttribute", и я получил рабочие результаты.
Пример кода, на который вы ссылались, имеет следующие свойства:
public class Class1
{
[DisplayName("Something To Name")]
public virtual string Name { get; set; }
Ваши как:
public class AccessoriesModel
{
public int Id { get; set; }
[Display(Name = "Acc 1")]
public bool Accessory1 { get; set; }
Так что эта разница в использовании атрибутов, возможно, была причиной того, что это не сработало для вас. Отдых, вы можете найти рабочий код ниже:
foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
{
if (propertyInfo.PropertyType == typeof(bool))
{
bool value = (bool)propertyInfo.GetValue(data, null);
if (value)
{
var attribute = propertyInfo.GetCustomAttributes(typeof(DisplayAttribute), true)
.Cast<DisplayAttribute>().Single();
string displayName = attribute.Name;
list.Add(displayName);
}
}
}
Я повторно использовал методы расширения из этого ответа /questions/11743604/poluchit-znachenie-atributa-displayname/11743617#11743617