Использование отражения для получения списка отображаемых имен из свойств класса

Я пытаюсь получить список отображаемых имен из класса, большинство свойств которого имеют логические значения:

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 свойства: https://stackoverflow.com/ а/10048758

Конечным результатом, который я ищу, является список строк (отображаемых имен), которые будут сформированы только истинными свойствами.

Заранее благодарю вас за помощь в этом.


person Ionea    schedule 20.05.2018    source источник
comment
Не используйте принятый ответ на этот вопрос. Используйте второй или третий ответы. Решение явно есть   -  person pinkfloydx33    schedule 20.05.2018


Ответы (1)


Я думаю, вы используете неправильный атрибут. Я просто взял фрагмент из https://stackoverflow.com/a/5015878/6866739 и заменил "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);
        }
    }
}

Я повторно использовал методы расширения из этого ответа https://stackoverflow.com/a/5015911/6866739

person Mikaal Anwar    schedule 20.05.2018
comment
Действительно, этот атрибут вызывал у меня головную боль. Спасибо! - person Ionea; 24.05.2018
comment
Наиболее желанный ... - person Mikaal Anwar; 24.05.2018