private object TraverseMember(object target, MemberTraversal member, bool isLastPathSegment) { if (target == null) return null; object result = null; // Is Target a Collection? // Extract first item target.TryAs<IEnumerable>(collection => { var list = Enumerable.Cast<object>(collection); var newTarget = list.FirstOrDefault(); result = TraverseMember(newTarget, member, isLastPathSegment); }); if (result == null) { // Target is a single object if (string.IsNullOrEmpty(member.MemberName)) // Self result = target; else // Get Related Member result = ReflectionHelper.GetMemberValue(target, member.MemberName); // Is it a Collection? result.TryAs<IEnumerable>(collection => { // If not last path segment // or supposed to extract item bool shouldExtractItem = !isLastPathSegment || member is ExtractFromCollectionTraversal; if (shouldExtractItem) result = ExtractItemFromCollection(collection.Cast<object>().ToList(), member); }); } return result; }
private object ExtractItemFromCollection(List<object> collection, MemberTraversal member) { object result = null; if (collection == null || collection.Count == 0) return null; // By default, Extract first item result = collection.First(); // or, Extract specific item from collection member.TryAs<ExtractFromCollectionTraversal>(extractTraversal => { result = collection[extractTraversal.IndexToExtract]; }); return result; }