Плавная проверка C# , если значение равно X или значение равно Y

#c# #fluentvalidation

Вопрос:

Я пытаюсь проверить тип, когда связанное свойство является либо «Одиночным», либо «Смешанным», но не когда оно «Двойное».

  RuleFor(session => session.SinglesMatchCount)
                .GreaterThan(0)
                .When(session => session.SessionMatchTypeId == SessionMatchTypes.Singles 
    or session => session.SessionMatchTypeId == SessionMatchTypes.Mixed);
 

Это не работает. Есть идеи, каков правильный синтаксис для этого ?

Комментарии:

1. Заменить or session => на || ?

2. вы стремитесь к сопоставлению шаблонов, например session.SessionMatchTypeId is SessionMatchTypes.Singles or SessionMatchTypes.Mixed ?

3. @CaiusJard Да, как лучше всего это сделать ?

4. @CaiusJard есть ли способ абстрагировать это от метода ? Существует более 20 свойств, которые будут проходить эту проверку.

5. Попробуйте что-то вроде public bool IsSessionSinglesOrMixed(SessionType session) { return session.SessionMatchTypeId == SessionMatchTypes.Singles || session.SessionMatchTypeId == SessionMatchTypes.Mixed; } , а затем в своем правиле: .When (session => IsSessionSinglesOrMixed(session))

Ответ №1:

Перечисление имеет 3 значения. 20 свойств, первые 12 из которых действительны для значений X или Y, являются истинными, а последние 8 действительны, если тип перечисления Z.

Я не могу решить, существует ли 20 различных перечислений или все они одинаковы, но это не имеет большого значения

Допустим, они все одинаковые. Если бы ваш класс выглядел так;

 class C{

  SomeEnum[] _e = new SomeEnum[20];

  public SomeEnum Property1 {
    get => _e[0];
    set => _e[0] = value;
  }

  public SomeEnum Property2 {
    get => _e[1];
    set => _e[1] = value;
  }
  ...
  public SomeEnum Property20 {
    get => _e[19];
    set => _e[19] = value;
  }
 

}

Тогда у вас может быть метод

 bool IsValid(){
  return _e.Take(12).All(e => e != SomeEnum.Z) amp;amp; _e.Skip(12).All(e => e == SomeEnum.Z);
}
 

И вы можете позвонить

 .When(c => c.IsValid())
 

Если ваши перечисления разных типов, вы можете сделать массив как int[] вместо этого и привести. Для проверки isValid убедитесь, что перечисление Z имеет одинаковое значение в каждом перечислении (например, 2)