コード例 #1
0
        /// <summary>
        /// Ignores all unmapped members.
        /// </summary>
        /// <typeparam name="TSource">The type of the t source.</typeparam>
        /// <typeparam name="TDestination">The type of the t destination.</typeparam>
        /// <param name="expression">The expression.</param>
        /// <returns>IMappingExpression&lt;TSource, TDestination&gt;.</returns>
        public static void IgnoreAllUnmappedMembers <TSource, TDestination>(this IMappingExpression <TSource, TDestination> expression)
        {
            // Code smell? Yes. Why? A BS excuse from automapper to remove ForAllOtherMembers.
            var memberConfigurations = expression.GetType().GetProperty("MemberConfigurations", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(expression) as List <IPropertyMapConfiguration>;
            var typeMapActions       = expression.GetType().GetProperty("TypeMapActions", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(expression) as List <Action <TypeMap> >;
            var types = ((ITypeMapConfiguration)expression).Types;

            bool hasDestinationMemberConfiguration(string name)
            {
                return(memberConfigurations.Any(m => m.DestinationMember.Name == name));
            }

            typeMapActions.Add(typeMap =>
            {
                foreach (var accessor in typeMap.DestinationSetters.Where(m => !hasDestinationMemberConfiguration(m.Name)))
                {
                    var exp = new MemberConfigurationExpression(accessor, types.SourceType);
                    memberConfigurations.Add(exp);
                    exp.Ignore();
                }
            });
        }