FluentValidation NullReferenceException - 防止检查空值的方法?

时间:2017-02-01 20:19:59

标签: c# asp.net-core fluentvalidation

如果我有这样的话:

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#的新手。这是处理这样的验证的正确方法吗?我是否需要使用空检查来包装所有这样的逻辑?

4 个答案:

答案 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();
});