public static VisitErrorCode TryExecute(object target, PropertyPath propertyName, int index, ref ChangeTracker changeTracker, out int count)
            {
                var action = new GetCountFromActualTypeCallback(target, propertyName, index, ref changeTracker);

                PropertyBagResolver.Resolve(target.GetType()).Cast(ref action);
                changeTracker = action.m_ChangeTracker;
                count         = action.m_Count;
                return(action.m_ErrorCode);
            }
        internal static VisitErrorCode TryGetCountImpl <TContainer>(ref TContainer container, PropertyPath propertyPath, int propertyPathIndex,
                                                                    ref ChangeTracker changeTracker, out int count)
        {
            var action = new GetCountAtPathGetter <TContainer>(propertyPath, propertyPathIndex);

            if (PropertyBagResolver.Resolve <TContainer>()
                .FindProperty(propertyPath[propertyPathIndex].Name, ref container, ref changeTracker, ref action))
            {
                count = action.Count;
                return(action.ErrorCode);
            }

            if (typeof(TContainer) != container.GetType())
            {
                return(GetCountFromActualTypeCallback.TryExecute(container, propertyPath, propertyPathIndex, ref changeTracker, out count));
            }

            count = -1;
            return(VisitErrorCode.InvalidPath);
        }