Comment pouvez-vous mapper une propriété sur une sous-propriété qui peut être null?
Par exemple, par exemple, le code suivant échouera avec une nullreferenceException, car la propriété utilisateur du contact est NULL. P>
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; } } }
3 Réponses :
Vous pouvez écrire le code de mappage comme suit: Ceci vérifiera si l'utilisateur code> code> est null ou non, puis assignez une chaîne EMTPY ou la < Code> Nom d'utilisateur code>. P> p>
Les grands esprits pensent que ressemblent - il suffit de trouver exactement la même solution :-)
Qu'en est-il de Nullable DateTime? Propriétés?
Vous da homme davehauser!
Si vous vous trouvez beaucoup de chèque NULL comme dans la réponse de Dave, vous pouvez envisager d'appliquer la technique que j'ai bloguée il y a un moment: Se débarrasser des chèques nuls dans les chaînes de propriétés . Cela vous permettra d'écrire ceci:
Salut @sandor drieënhuizen, est le ?? String.empty code> pièce ci-dessus nécessaire? J'ai vu quelques exemples dans votre article où vous utilisez uniquement le
opt.nullsafemapefrom code> pièce
@Adolfoperez: le ?? string.empty code> n'est pas nécessaire, c'est juste un moyen pratique de s'assurer que le résultat n'est jamais
null code>.
L'URL est maintenant en panne.
Merci de me le faire savoir. J'ai mis à jour l'URL. Le blog a disparu mais j'ai gardé un fichier PDF du poste.
Une solution que j'ai utilisée est de créer une fermeture autour du délégué d'origine, qui l'enveloppe dans un bloc d'essai / attrape. Il est malheureusement nécessaire d'utiliser expression.cIpile () code> pour arrêter Visual Studio de saisir l'exception lorsqu'il est jeté dans le délégué original. Probablement pas recommandé dans des environnements hautes performances, mais je n'ai jamais eu de problème l'utilisant dans des affaires régulières d'interface utilisateur. Votre militant peut varier.
Méthode d'extension H2>
.ForMember(dest => dest.Target, opt => opt.NullSafeMapFrom(src => src.Something.That.Will.Throw));
Le coup de performance causé par l'appel code> expression.ca () code> peut être largement atténué en appliquant un mécanisme de mise en cache. La prise try est un problème plus important, cependant, la performance sage. Mais comme vous l'avez dit, si seulement appelé occasionnellement (contrairement aux grandes boucles), cela ne devrait pas être un problème.