#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)