如果值为 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 验证的主要内容,如果未能解决你的问题,请参考以下文章