如果值为 X 或值为 Y,C# Fluent 验证

Posted

技术标签:

【中文标题】如果值为 X 或值为 Y,C# Fluent 验证【英文标题】:C# Fluent Validation if Value is X or value is Y 【发布时间】:2021-11-29 14:45:07 【问题描述】:

我正在尝试在相关属性为“单”或“混合”时验证类型,但在其“双”时不验证

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

这不起作用。任何想法什么是正确的语法?

【问题讨论】:

||替换or session =>? 你的目标是模式匹配,比如session.SessionMatchTypeId is SessionMatchTypes.Singles or SessionMatchTypes.Mixed @CaiusJard 是的,最好的方法是什么? @CaiusJard 有没有办法把它抽象成一个方法?有 20 多个属性将进行此验证。 试试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 个在 Enum 类型为 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) && _e.Skip(12).All(e => e == SomeEnum.Z);

你可以打电话

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

如果您的枚举是不同的类型,您可以将数组设置为 int[] 并进行强制转换。要检查 IsValid,请确保 Z 枚举在每个枚举中具有相同的值(例如 2)

【讨论】:

以上是关于如果值为 X 或值为 Y,C# Fluent 验证的主要内容,如果未能解决你的问题,请参考以下文章

●洛谷P3688 [ZJOI2017]树状数组

参数丢失或值为空 laravel

ParameterMissing 参数丢失或值为空

JavaScript运算符

表 Y 中 X 列的值为 DBNull

我在尝试显示用户个人资料页面时遇到错误“参数丢失或值为空:user_id”