如果我有这样的话:
When(x => x.SendMail.Equals("Y"), () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});
且SendMail
没有值,我会得到NullReferenceException
。但是,如果我这样包围When()
:
When(x => x.SendMail != null, () =>
{
When(x => x.SendMail.Equals("Y"), () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});
});
它按照我的预期工作,当SendMail
没有值时,我没有得到NRE。我是FluentValidaton和C#的新手。这是处理这样的验证的正确方法吗?我是否需要使用空检查来包装所有这样的逻辑?
答案 0 :(得分:3)
最简单的方法就是切换比较。
When(x => x.SendMail.Equals("Y"), () => // etc
变为
When(x => "Y".Equals(x.SendMail), () => // etc
这是因为" Y"永远不会null
(因此可以调用Equals
方法,这是当前代码失败的地方),并且在{{}内进行比较时也不会抛出NRE 1}}作为Equals
值的方法只会返回null
。
答案 1 :(得分:1)
我建议做这样的事情
When(x => x.SendMail != null && x.SendMail.Equals("Y"), () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});
这样,只有第一个(x.SendMail.Equals("Y")
)为真,才会评估和声明(x.SendMail != null
)的第二个条件。
此规则适用于任何布尔表达式。
答案 2 :(得分:1)
您正在做的事情可以简化为
When(x => x.SendMail != null && x.SendMail.Equals("Y"), () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});
或者如果使用最新版本c#
When(x => x.SendMail?.Equals("Y") ?? false, () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});
答案 3 :(得分:0)
@Ryan Buening你试图调用null对象的实例方法,因此你得到NullReferenceException,这对c#来说是正常的。我想你可以使用c#6
中的空条件运算符When(x => x.SendMail?.Equals("Y"), () =>
{
RuleFor(x => x.To).NotEmpty();
RuleFor(x => x.From).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
});