Ejemplo n.º 1
0
        private void WalkCollection(
            ReflectionWalkerCallback callback
            , Type targetType
            , object targetObject
            , object mirrorObject
            , string objectName)
        {
            if (targetObject is string)
            {
                callback(targetType, targetObject, mirrorObject, null, objectName);
                return;
            }

            IEnumerable targetAsEnumerable = targetObject as IEnumerable;
            IList       targetAsList       = targetObject as IList;

            FieldInfoCollection fields = GetWalkablePropertiesAndFields(targetType);

            MemberInfo countField  = fields.Find(f => f.Name == "Count");
            MemberInfo lengthField = fields.Find(f => f.Name == "Length");

            if (countField != null)
            {
                callback(targetType, targetObject, mirrorObject, countField, objectName);
            }

            if (lengthField != null)
            {
                callback(targetType, targetObject, mirrorObject, lengthField, objectName);
            }

            if (targetAsList != null)
            {
                for (int i = 0; i < targetAsList.Count; i++)
                {
                    object innerTarget = targetAsList[i];

                    if (innerTarget == null)
                    {
                        Console.WriteLine("CodeGenWalker skipping list item {0} since the inner target is null", i);
                        continue;
                    }

                    bool   isSimpleType      = IsSimpleType(innerTarget.GetType());
                    object innerMirrorTarget = null;

                    if (mirrorObject != null)
                    {
                        innerMirrorTarget = ((IList)mirrorObject)[i];
                    }

                    string objectNameWithIndexer = string.Format("{0}[{1}]", objectName, i);

                    if (IsOfType(innerTarget, Options.UpcastTypes))
                    {
                        objectNameWithIndexer = GetUpCastTargetName(innerTarget, objectNameWithIndexer);
                    }

                    if (isSimpleType)
                    {
                        // THIS WILL ALWAYS BREAK MOFO
                        callback(targetType, innerTarget, innerMirrorTarget, null, objectNameWithIndexer);
                    }
                    else
                    {
                        InnerWalk(callback, innerTarget, innerMirrorTarget, objectNameWithIndexer);
                    }
                }
            }
            else if (targetAsEnumerable != null)
            {
                throw TestMonkeyException.Create("Object Inspector doesn't work with pure IEnumerables: " + objectName);
            }
        }
Ejemplo n.º 2
0
        internal void IterateMemberList(ReflectionWalkerCallback callback, Type targetType, object targetObject, object mirrorObject, string objectName, FieldInfoCollection memberInfoCollection)
        {
            foreach (MemberInfo memberInfo in memberInfoCollection)
            {
                if (IsExcludedPropertyName(Options, memberInfo.Name))
                {
                    continue;
                }

                if (IsExcludedType(Options, memberInfo))
                {
                    continue;
                }

                bool   targetPropertySwallowedException;
                object targetPropertyValue = InvokeMember(targetType, targetObject, memberInfo, Options.BindingFlags, true, out targetPropertySwallowedException);
                object mirrorPropertyValue = null;

                if (_mirrorInUse)
                {
                    bool mirrorPropertySwallowedExpection;
                    mirrorPropertyValue = InvokeMember(targetType, mirrorObject, memberInfo, Options.BindingFlags, true, out mirrorPropertySwallowedExpection);
                }

                if (targetPropertyValue != null && !IsSimpleType(targetPropertyValue.GetType()))
                {
                    InnerWalk(callback, targetPropertyValue, mirrorPropertyValue, objectName + "." + memberInfo.Name);
                }
                else
                {
                    callback(targetType, targetObject, mirrorObject, memberInfo, objectName);
                }
            }
        }