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