Как проверить, что более 1 свойства объекта имеют значение - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть класс с n свойствами, и мне нужно знать, если значение имеет более 1 свойства, оно будет ложным, я пишу такой метод CheckValue

 public class ClassExample
    {
        public ClassExample(string value1, string value2, string value3)
        {
            Value1 = value1;
            Value2 = value2;
            Value3 = value3;
            if (CheckValue()) throw new Exception("Not allow set value for both Value1, Value2, Value3");
        }
        public string Value1 { get;  }
        public string Value2 { get;  }
        public string Value3 { get; }

        public bool CheckValue()
        {
            if ((Value1 != null ? 1 : 0) +
                (Value2 != null ? 1 : 0) +
                (Value3 != null ? 1 : 0) > 1)
            {
                return true;
            }

            return false;
        }
    }

Есть ли лучший способ написать метод CheckValue?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Предполагая, что все свойства имеют одинаковый тип или что все они обнуляются.Вы можете использовать params:

 public class ClassExample
    {
        public ClassExample(params string[] values)
        {
            if (values == null || values.Count(p => p != null) != 1) throw new ArgumentException("Just 1 value please");
            if (values.Length > 0) Value1 = values[0];
            if (values.Length > 1) Value2 = values[1];
            // rest of property assignments;
        }
        public string Value1 { get; private set; }
        public string Value2 { get; private set; }
        public string Value3 { get; private set; }

    }
}
0 голосов
/ 19 февраля 2019

Вы можете сделать следующее.Для примера, я предполагаю, что ваши свойства имеют имя с именем шаблона Value_.Вы можете изменить фильтр поиска при необходимости.

public bool CheckValue()
{
       return this.GetType().GetProperties()
               .Where(property=> property.Name.StartsWith("Value"))
               .Count(property=>property.GetValue(this,null)!=null)>=1;

}

Если вы не хотите фильтровать свойства, вы можете сделать следующее.

 return `this.GetType().GetProperties().Count(property=>property.GetValue(this,null)!=null)>=1;

Возможно, вам также придется определить ожидаемый/ Значение по умолчанию для типа значения, а также добавить проверки для того же самого, так как этот запрос выше проверяет только для нулевых значений.Но, пожалуйста, помните о влиянии производительности на использование отражения`.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...