У меня есть класс, который имеет много свойств bool. Как я могу создать другое свойство, которое представляет собой список строк, который содержит имя свойств, имеющих значение true?

Смотрите начальную попытку ниже - не могу понять, как отфильтровать истинные

public class UserSettings
{
    public int ContactId { get; set; }
    public bool ShowNewLayout { get; set; }
    public bool HomeEnabled { get; set; }
    public bool AccountEnabled { get; set; }

    // lots more bool properties here

    public IEnumerable<string> Settings
    {
        get
        {
            return GetType()
                .GetProperties()
                .Where(o => (bool)o.GetValue(this, null) == true) //this line is obviously wrong
                .Select(o => nameof(o));
        }
    }
}
7
ChrisCa 24 Апр 2017 в 16:00

2 ответа

Лучший ответ

Вы можете сделать это следующим образом - все те свойства, которые имеют тип bool и true

public IEnumerable<string> Settings
{
    get
    {
        return GetType()
            .GetProperties().Where(p => p.PropertyType == typeof(bool) 
                                         && (bool)p.GetValue(this, null))
            .Select(p => p.Name);
    }
}
16
AlexB 19 Сен 2019 в 14:55

Без LINQ:

foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
{
    if (propertyInfo.PropertyType == typeof(bool))
    {
        bool value = (bool)propertyInfo.GetValue(data, null);

        if(value)
        {
           //add propertyInfo to some result
        }
    }
}            
3
Adam Jachocki 24 Апр 2017 в 13:31
43588771