AutoMapper de cartographie à une propriété d'un nullable propriété
Comment vous pouvez mapper une propriété à une sous-propriété qui peut être nulle?
par exemple, le code suivant va échouer avec une NullReferenceException parce que le Contact de l'Utilisateur de propriété est null.
using AutoMapper;
namespace AutoMapperTests
{
class Program
{
static void Main( string[] args )
{
Mapper.CreateMap<Contact, ContactModel>()
.ForMember( x => x.UserName, opt => opt.MapFrom( y => y.User.UserName ) );
Mapper.AssertConfigurationIsValid();
var c = new Contact();
var co = new ContactModel();
Mapper.Map( c, co );
}
}
public class User
{
public string UserName { get; set; }
}
public class Contact
{
public User User { get; set; }
}
public class ContactModel
{
public string UserName { get; set; }
}
}
J'aimerais ContactModel du nom d'utilisateur par défaut est une chaîne vide à la place.
J'ai essayé le NullSubstitute méthode, mais je suppose que c'est en essayant de fonctionner avec de l'Utilisateur.Nom d'utilisateur, plutôt que simplement sur la propriété de l'Utilisateur.
OriginalL'auteur David Gardiner | 2010-11-04
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire le code de mappage comme suit:
Il s'agira de vérifier si la
User
est null ou pas, puis affecter une chaîne vide ou leUserName
.Vous êtes donc à droite sur le grand esprit 🙂
Qu'en est nullable DateTime? propriétés?
OriginalL'auteur davehauser
Si vous vous retrouver à faire beaucoup de nulle vérification comme Dave réponse, vous pourriez envisager d'appliquer la technique que j'ai blogué à propos de tout à l'heure: Se débarrasser de nulle vérifie dans bien des chaînes. Cela vous permettra d'écrire ceci:
?? string.Empty
morceau ci-dessus a besoin? J'ai vu quelques exemples dans votre article où vous utilisez uniquement leopt.NullSafeMapFrom
piècele
?? string.Empty
n'est pas nécessaire, c'est juste un moyen pratique pour assurez-vous que le résultat n'est jamaisnull
.L'Url est maintenant en baisse.
Merci de me laisser savoir. J'ai mis à jour l'url. Le blog avait disparu, mais j'ai gardé un fichier PDF de la poste.
OriginalL'auteur Sandor Drieënhuizen
Une solution que j'ai utilisé est de créer une clôture autour de la délégué d'origine, qui s'enroule dans un bloc try/catch. Il est malheureusement nécessaire d'utiliser
Expression.Compile()
pour arrêter de Visual Studio à partir de la capture de l'exception quand il est lancé dans la délégué d'origine. Probablement pas recommandé dans les environnements hautes performances, mais je n'ai jamais eu aucun problème à l'utiliser régulièrement des éléments d'INTERFACE utilisateur. Votre kilométrage peut varier.Méthode d'Extension
Utilisation
Expression.Compile()
appel peut être largement atténués par l'application d'un mécanisme de mise en cache. Le try-catch est un plus gros problème cependant, la performance sage. Mais comme vous l'avez dit, si seulement appelé parfois (à la différence de dans de grandes boucles), il ne devrait pas être un problème.OriginalL'auteur James Gregory