2017-02-01 1 views
1

Si j'ai quelque chose comme ceci:FluentValidation NullReferenceException - Comment empêcher la vérification des valeurs nulles?

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

et SendMail n'a pas de valeur, je vais obtenir un NullReferenceException. Cependant, si je l'entoure When() comme ceci:

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

cela fonctionne comme je l'attendre et je ne suis pas NRE quand SendMail n'a pas de valeur. Je suis nouveau à FluentValidaton et C# en général. Est-ce la bonne façon de gérer les validations comme celle-ci? Dois-je envelopper toute logique comme celle-ci avec des chèques nuls?

+0

Êtes-vous capable de faire quand (x => x.SendMail! = Null && x.SendMail.Equals ("Y"), ...); ' – Nkosi

Répondre

3

La meilleure chose à faire est simplement de changer la comparaison.

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

devient

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

Cela fonctionne parce que « Y » est jamais null (donc la méthode Equals peut être appelé qui est où votre code actuel ne) et pas non plus jeter un NRE quand faire une comparaison à l'intérieur de la méthode Equals en tant que valeur null retournera simplement false.

+0

J'aime cette réponse. Je me demande maintenant si 'object.Equals (" Y ", x.SendMail)' est également une bonne option? – Nkosi

+0

@Nkosi - Je ne vois pas pourquoi pas 'string.Equals' si l'OP voulait faire une comparaison insensible à la casse en incluant un paramètre' StringComparison'. – Igor

+0

Cela a du sens. Je ne savais pas si «Y» était un mecve. – Nkosi

1

Je recommande de faire quelque chose comme ça

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

De cette façon, deuxième condition et l'état (x.SendMail.Equals("Y")) évalue que si un premier (x.SendMail != null) est vrai. Cette règle fonctionne pour toute expression booléenne.

1

Ce que vous faites peut être simplifiée pour

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

Ou si vous utilisez dernière version C#

When(x => x.SendMail?.Equals("Y") ?? false,() => 
{ 
    RuleFor(x => x.To).NotEmpty(); 
    RuleFor(x => x.From).NotEmpty(); 
    RuleFor(x => x.EmailAddress).NotEmpty(); 
}); 
0

@Ryan Buening vous essayez d'appeler par exemple méthode d'objet nul si vous obtenez NullReferenceException et c'est normal pour C#. Je pense que vous pourriez utiliser l'opérateur conditionnel nul de C# 6

When(x => x.SendMail?.Equals("Y"),() => 
{ 
    RuleFor(x => x.To).NotEmpty(); 
    RuleFor(x => x.From).NotEmpty(); 
    RuleFor(x => x.EmailAddress).NotEmpty(); 
}); 
+1

Il n'est pas nécessaire de répéter ce que les autres ont posté longtemps avant votre réponse – Tseng