FluentValidation — Преобразование опций в базовый тип?

#c# #fluentvalidation

Вопрос:

Скажи, что у меня есть этот мидель

 class Model {  public Optionallt;stringgt; Str { get; set; } }  

Можно ли сопоставить необязательное поле таким образом, чтобы правила игнорировались, когда необязательное поле пустое и в противном случае оно не используется? Например, когда HasValue верно — примените всю цепную проверку, когда HasValue ложно — игнорируйте всю цепную проверку.

 class MyValidator : AbstractValidatorlt;Modelgt; {  MyValidator()  {  RuleForEx(x =gt; x.Opt) // see below  .NotNull(); // apply string rules, not Optionallt;stringgt; rules  }   // Is it possible to implement something like this?  private IRuleBuilderInitiallt;Model, stringgt; RuleForEx(Expressionlt;Funclt;T, Optionallt;stringgt;gt;gt; expression)  {  return Transform(expression, x =gt; x.HasValue : x.Value ? `[no idea what is here]`);  } }  

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

1. Я чувствую, что был бы возможен метод расширения с именем RuleForOptional(x =gt; x.Opt) , который возвращает объект построителя правил для T in Optionallt;Tgt; .

2. RuleFor(x =gt; x.Opt.Value).NotNull().When(x =gt; x.Opt.HasValue); Не работает? Я также ставлю под сомнение использование необязательного здесь в модели представления.

3. @GregBurghardt, судя по реализации Optionallt;Tgt; , это вызовет исключение, если нет значения и Value доступ к нему осуществляется без проверки HasValue , но это выражение, а не просто функция, так что, возможно, этот подход сработает. Причина этого — моя лень-я хочу повторно использовать существующие проверки и не хочу писать свои собственные

4. Выполняется When(...) перед вызовом получателя. Но, я понимаю вашу лень 🙂

5. Может быть, создать класс с именем OptionalRuleBuilderlt;T, TPropertygt; , который реализует IRuleBuilderInitiallt;T, TPropertygt; ? Затем создайте общий родительский класс для ваших валидаторов с RuleForOptional помощью метода?