private bool DetermineRecursion() { if (IsSimple) { return(false); } if (_memberChain.Length < 3) { // Need at least 3 members for recursion: // Foo -> Foo.ChildFoo -> Foo.ChildFoo.ChildFoo return(false); } if (LeafMember.IsEnumerableElement()) { // Recurse on enumerable and complex type members, // not enumerable elements: return(false); } for (var i = _memberChain.Length - 2; i > 0; --i) { if (LeafMember == _memberChain[i]) { return(true); } } return(false); }
private bool DetermineRecursion() { if (IsSimple || (Type == typeof(object))) { return(false); } if (Depth < 3) { // Need at least 3 members for recursion: // Foo -> Foo.ChildFoo -> Foo.ChildFoo.ChildFoo return(false); } for (var i = Depth - 2; i >= 0; --i) { if ((LeafMember.Type == MemberChain[i].Type) && ((Depth - i > 2) || LeafMember.Equals(MemberChain[i]))) { // Recursion if the types match and either: // 1. It's via an intermediate object, e.g. Order.OrderItem.Order, or // 2. It's the same member, e.g. root.Parent.Parent return(true); } } return(false); }
private bool CreateNonDictionaryChildMembers(Type sourceType) { // If this DictionaryTargetMember represents an object-typed dictionary // entry and we're mapping from a source of type object, we switch from // mapping to flattened entries to mapping entire objects: return(HasObjectEntries && LeafMember.IsEnumerableElement() && (MemberChain[Depth - 2] == _rootDictionaryMember.LeafMember) && (sourceType == typeof(object))); }
protected virtual QualifiedMember CreateRuntimeTypedMember(Type runtimeType) { var newMemberChain = new Member[Depth]; for (var i = 0; i < Depth - 1; i++) { newMemberChain[i] = MemberChain[i]; } newMemberChain[Depth - 1] = LeafMember.WithType(runtimeType); return(CreateFinalMember(new QualifiedMember(newMemberChain, this))); }
public QualifiedMember WithType(Type runtimeType) { if (runtimeType == Type) { return(this); } var runtimeTypedMember = _runtimeTypedMemberCache.GetOrAdd(runtimeType, rt => { var newMemberChain = new Member[_memberChain.Length]; for (var i = 0; i < _memberChain.Length - 1; i++) { newMemberChain[i] = _memberChain[i]; } newMemberChain[_memberChain.Length - 1] = LeafMember.WithType(rt); return(new QualifiedMember(newMemberChain, this)); }); return(runtimeTypedMember); }
public virtual Expression GetPopulation(Expression value, IMemberMapperData mapperData) => LeafMember.GetPopulation(mapperData.TargetInstance, value);
public virtual Expression GetAccess(Expression instance, IMemberMapperData mapperData) => LeafMember.GetAccess(instance);
public Expression GetAccess(Expression instance) => LeafMember.GetAccess(instance);