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);
        }