Использование отражения для получения списка 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

Другие вопросы по тегам