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