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