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

FluentValidation NullReferenceException - Way to prevent checking for null values?

如果我有这样的东西:

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

我建议这样做

When(x => x.SendMail != null && x.SendMail.Equals("Y"), () =>
{
    RuleFor(x => x.To).NotEmpty();
    RuleFor(x => x.From).NotEmpty();
    RuleFor(x => x.EmailAddress).NotEmpty();
});

这样,and 语句 (x.SendMail.Equals("Y")) 的第二个条件仅在第一个条件 (x.SendMail != null) 为真时才计算。 此规则适用于任何布尔表达式。

你所做的可以简化为

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

@Ryan Buening 您正在尝试调用 null 对象的实例方法,因此您将获得 NullReferenceException,这对于 c# 来说是正常的。我认为您可以使用 c#6

中的 null 条件运算符
When(x => x.SendMail?.Equals("Y"), () =>
{
    RuleFor(x => x.To).NotEmpty();
    RuleFor(x => x.From).NotEmpty();
    RuleFor(x => x.EmailAddress).NotEmpty();
});

最简单的方法就是切换比较。

When(x => x.SendMail.Equals("Y"), () => // etc

变成

When(x => "Y".Equals(x.SendMail), () => // etc

这是有效的,因为 "Y" 永远不会 null所以可以调用 Equals 方法,这是您当前代码失败的地方)并且在 Equals 方法内部进行比较时也不会抛出 NRE,因为 null 值只会 return false.