【问题标题】:C# Fluent Validation if Value is X or value is Y如果值为 X 或值为 Y,C# Fluent 验证
【发布时间】: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))

标签: c# fluentvalidation


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2023-01-13
    • 2011-12-01
    • 2021-01-03
    相关资源
    最近更新 更多