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
.
如果我有这样的东西:
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
.