private static QualifiedMember CreateMember(
            Expression memberAccessExpression,
            Func <Type, Member> rootMemberFactory,
            Func <Type, IList <Member> > membersFactory,
            MapperContext mapperContext)
        {
            void ThrowIfUnsupported(ExpressionType unsupportedNodeType) =>
            throw new NotSupportedException($"Unable to get member access from {unsupportedNodeType} Expression");

            var memberAccesses = memberAccessExpression.GetMemberAccessChain(ThrowIfUnsupported, out var rootExpression);
            var rootMember     = rootMemberFactory.Invoke(rootExpression.Type);
            var parentMember   = rootMember;

            var memberChain = new Member[memberAccesses.Count + 1];

            memberChain[0] = rootMember;

            for (var i = 0; i < memberAccesses.Count; i++)
            {
                var memberAccess = memberAccesses[i];
                var memberName   = GetMemberName(memberAccess);
                var members      = membersFactory.Invoke(parentMember.Type);
                var member       = members.FirstOrDefault(m => m.Name == memberName);

                if (member == null)
                {
                    return(null);
                }

                memberChain[i + 1] = member;
                parentMember       = member;
            }

            return(QualifiedMember.From(memberChain, mapperContext));
        }
        public QualifiedMember RootTarget <TTarget>()
        {
            var memberKey = QualifiedMemberKey.ForTarget <TTarget>();

            var rootMember = _memberCache.GetOrAdd(
                memberKey,
                k => QualifiedMember.From(Member.RootTarget <TTarget>(), _mapperContext));

            return((QualifiedMember)rootMember);
        }
        public IQualifiedMember RootSource <TSource>()
        {
            var memberKey = QualifiedMemberKey.ForSource <TSource>();

            var rootMember = _memberCache.GetOrAdd(
                memberKey,
                k => QualifiedMember.From(Member.RootSource <TSource>(), _mapperContext));

            return(rootMember);
        }
        public QualifiedMember RootTarget <TSource, TTarget>()
        {
            var rootMember = _memberCache.GetOrAdd(
                QualifiedMemberKey.ForTarget <TSource, TTarget>(),
                k =>
            {
                var targetMember = QualifiedMember.From(Member.RootTarget <TTarget>(), _mapperContext);

                return(GetFinalTargetMember(targetMember));
            });

            return((QualifiedMember)rootMember);
        }
        public IQualifiedMember RootSource <TSource, TTarget>()
        {
            var rootMember = _memberCache.GetOrAdd(
                QualifiedMemberKey.ForSource <TSource, TTarget>(),
                k =>
            {
                var sourceMember        = QualifiedMember.From(Member.RootSource <TSource>(), _mapperContext);
                var matchedTargetMember = RootTarget <TSource, TTarget>();

                return(GetFinalSourceMember(sourceMember, matchedTargetMember));
            });

            return(rootMember);
        }
        private static QualifiedMember CreateMember(
            Expression memberAccessExpression,
            Func <Type, Member> rootMemberFactory,
            Func <Type, IList <Member> > membersFactory,
            MapperContext mapperContext)
        {
            var expression     = memberAccessExpression;
            var memberAccesses = new List <Expression>();

            while (expression.NodeType != ExpressionType.Parameter)
            {
                var memberExpression = GetMemberAccess(expression);
                memberAccesses.Insert(0, memberExpression);
                expression = memberExpression.GetParentOrNull();
            }

            AdjustMemberAccessesIfRootedInMappingData(memberAccesses, ref expression);

            var rootMember   = rootMemberFactory.Invoke(expression.Type);
            var parentMember = rootMember;

            var memberChain = new Member[memberAccesses.Count + 1];

            memberChain[0] = rootMember;

            for (var i = 0; i < memberAccesses.Count; i++)
            {
                var memberAccess = memberAccesses[i];
                var memberName   = GetMemberName(memberAccess);
                var members      = membersFactory.Invoke(parentMember.Type);
                var member       = members.FirstOrDefault(m => m.Name == memberName);

                if (member == null)
                {
                    return(null);
                }

                memberChain[i + 1] = member;
                parentMember       = member;
            }

            return(QualifiedMember.From(memberChain, mapperContext));
        }
Example #7
0
        private static QualifiedMember CreateMember(
            Expression memberAccessExpression,
            Func <Type, Member> rootMemberFactory,
            Func <Type, IList <Member> > membersFactory,
            Action <ExpressionType> nonMemberAction,
            MapperContext mapperContext)
        {
            var memberAccesses = memberAccessExpression.GetMemberAccessChain(nonMemberAction, out var rootExpression);

            if (memberAccesses.None())
            {
                return(null);
            }

            var rootMember   = rootMemberFactory.Invoke(rootExpression.Type);
            var parentMember = rootMember;

            var memberChain = new Member[memberAccesses.Count + 1];

            memberChain[0] = rootMember;

            for (var i = 0; i < memberAccesses.Count;)
            {
                var memberAccess = memberAccesses[i++];
                var memberName   = GetMemberName(memberAccess);
                var members      = membersFactory.Invoke(parentMember.Type);
                var member       = members.FirstOrDefault(memberName, (mn, m) => m.Name == mn);

                if (member == null)
                {
                    return(null);
                }

                memberChain[i] = member;
                parentMember   = member;
            }

            return(QualifiedMember.From(memberChain, mapperContext));
        }