如何让这个验证逻辑更好?

How to make this validation logic better?

我的验证层中有一段代码,如 ----

if (string.IsNullOrEmpty(model.CreditCard) && string.IsNullOrEmpty(model.Billing))
            {
                failures.Add(new FailedValidation(
                        "Billing",
                        "Billing definition incorrect."));
            }  


if (!string.IsNullOrEmpty(model.CreditCard) && !string.IsNullOrEmpty(model.Billing))
{
   failures.Add(new FailedValidation(
       "Billing",
        "Billing definition incorrect."));
}

至少应提供 model.Billingmodel.CreditCard 之一的要求。两者都不能提供。

现在,我要验证第三个新属性 - model.DebitCard - 验证逻辑变得更加混乱,因为我必须提供组合。

至少应提供一项,且仅应提供其中一项,否则验证失败。

如何以可扩展且高效的方式编写此逻辑,以便如果明天有第四个属性也可以轻松地考虑在内?

您可以将这些字段组合在一起并检查它们以确保只有一个是非空的。

也许这对你有用:

var fields = new List<string> { model.CreditCard, model.Billing };

if (fields.Count(x => !string.IsNullOrEmpty(x)) != 1)
    failures.Add(new FailedValidation("Billing", "Billing definition incorrect."));

你考虑过异或状态吗?

bool isValid = !string.IsNullOrEmpty(model.CreditCard) ^ !string.IsNullOrEmpty(model.Billing);
if (!isValid)
{
            failures.Add(new FailedValidation(
                    "Billing",
                    "Billing definition incorrect."));
 }