Comment ignorer toutes les propriétés marquées comme virtuelles

J’utilise virtual mots clés virtual pour certaines de mes propriétés pour le chargement paresseux EF. J’ai un cas dans lequel toutes les propriétés de mes modèles marquées comme virtual devraient être ignorées d’AutoMapper lors du mappage de la source vers la destination.

Existe-t-il un moyen automatique d’y parvenir ou devrais-je ignorer chaque membre manuellement?

Vous pouvez créer une extension de mappage et l’utiliser:

 namespace MywebProject.Extensions.Mapping { public static class IgnoreVirtualExtensions { public static IMappingExpression IgnoreAllVirtual( this IMappingExpression expression) { var desType = typeof(TDestination); foreach (var property in desType.GetProperties().Where(p => p.GetGetMethod().IsVirtual)) { expression.ForMember(property.Name, opt => opt.Ignore()); } return expression; } } } 

Utilisation:

 Mapper.CreateMap().IgnoreAllVirtual(); 

La réponse de inquisitive fonctionne bien, mais elle peut être augmentée pour une utilisation réelle, lorsque certains mappages sont effectués à partir de modèles de données vers des modèles de service et que les membres virtuels du type source doivent être ignorés.

De plus, si le type implémente une interface, ces propriétés apparaîtront comme virtuelles !IsFinal faut donc append la condition !IsFinal pour supprimer ces propriétés virtuelles faussement positives.

 public static class AutoMapperExtensions { public static IMappingExpression IgnoreAllDestinationVirtual(this IMappingExpression expression) { var desType = typeof(TDestination); foreach (var property in desType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal)) { expression.ForMember(property.Name, opt => opt.Ignore()); } return expression; } public static IMappingExpression IgnoreAllSourceVirtual(this IMappingExpression expression) { var srcType = typeof(TSource); foreach (var property in srcType.GetProperties().Where(p => p.GetGetMethod().IsVirtual && !p.GetGetMethod().IsFinal)) { expression.ForSourceMember(property.Name, opt => opt.Ignore()); } return expression; } } 

Comme nous utilisions des propriétés virtuelles, j’ai dû réécrire l’extension comme suit:

 private static readonly Type CollectionBaseType = typeof(ICollection<>); public static IMappingExpression IgnoreNavigationProperties( this IMappingExpression expression) { var desType = typeof(TDestination); foreach (var property in desType.GetProperties() .Where(p => IsCollectionProperty(p) || HasForeignKeyAtsortingbute(p))) { expression.ForMember(property.Name, opt => opt.Ignore()); } return expression; } private static bool IsCollectionProperty(PropertyInfo property) { var propertyType = property.PropertyType; return propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == CollectionBaseType; } private static bool HasForeignKeyAtsortingbute(PropertyInfo property) => property.GetCustomAtsortingbute() != null; 

En substance, je vérifie si la propriété est de type ICollection<> ou si elle possède l’atsortingbut [ForeignKey] .

Pour corriger la réponse de @Alexei , n’utilisez pas la méthode ForSourceMember , comme celle dont il est question ici dans github C’est juste pour la validation.

Une autre façon consiste à utiliser ForAllPropertyMaps comme dans cette réponse .