/// <summary>
        /// Initialize the tests.
        /// </summary>
        public virtual void Initialize()
        {
            TypeFactory = new TypeDescriptorFactory();
            var myClassDesc = TypeFactory.Find(typeof(MyClass));
            var myStructDesc = TypeFactory.Find(typeof(MyStruct));
            ListClassDesc = (CollectionDescriptor)TypeFactory.Find(typeof(List<MyClass>));
            MapClassDesc = (DictionaryDescriptor)TypeFactory.Find(typeof(Dictionary<string, MyClass>));

            MemberValue = myClassDesc.Members.FirstOrDefault(member => member.Name == "Value");
            MemberSub = myClassDesc.Members.FirstOrDefault(member => member.Name == "Sub");
            MemberStruct = myClassDesc.Members.FirstOrDefault(member => member.Name == "Struct");
            MemberSubs = myClassDesc.Members.FirstOrDefault(member => member.Name == "Subs");
            MemberMaps = myClassDesc.Members.FirstOrDefault(member => member.Name == "Maps");
            MemberX = myStructDesc.Members.FirstOrDefault(member => member.Name == "X");
            MemberClass = myStructDesc.Members.FirstOrDefault(member => member.Name == "Class");
        }
Exemple #2
0
        /// <summary>
        /// Visits the specified object.
        /// </summary>
        /// <param name="obj">The object.</param>
        /// <param name="descriptor">The descriptor.</param>
        /// <exception cref="ArgumentNullException">
        /// obj
        /// or
        /// descriptor
        /// </exception>
        /// <exception cref="ArgumentException">Descriptor [{0}] type doesn't correspond to object type [{1}].ToFormat(descriptor.Type, obj.GetType())</exception>
        protected void Visit(object obj, ITypeDescriptor descriptor)
        {
            if (obj == null)
            {
                VisitNull();
                return;
            }

            var objectType = obj.GetType();

            if (descriptor == null || descriptor.Type != objectType)
            {
                descriptor = TypeDescriptorFactory.Find(objectType);
            }

            if (descriptor is NullableDescriptor)
            {
                descriptor = TypeDescriptorFactory.Find(((NullableDescriptor)descriptor).UnderlyingType);
            }

            context.Instance   = obj;
            context.Descriptor = (ObjectDescriptor)descriptor;

            switch (descriptor.Category)
            {
            case DescriptorCategory.Primitive:
                VisitPrimitive(obj, (PrimitiveDescriptor)descriptor);
                break;

            default:
                // Note that the behaviour is slightly different if a type has a custom visitor or not.
                // If it has a custom visitor, it will visit the object even if the object has been already visited
                // otherwise it will use CanVisit() on this instance. The CanVisit() is tracking a list of
                // visited objects and it will not revisit the object.
                IDataCustomVisitor customVisitor;
                if (!mapTypeToCustomVisitors.TryGetValue(objectType, out customVisitor) && CustomVisitors.Count > 0)
                {
                    for (var i = CustomVisitors.Count - 1; i >= 0; i--)
                    {
                        var dataCustomVisitor = CustomVisitors[i];
                        if (dataCustomVisitor.CanVisit(objectType))
                        {
                            customVisitor = dataCustomVisitor;
                            mapTypeToCustomVisitors.Add(objectType, dataCustomVisitor);
                            break;
                        }
                    }
                }

                if (customVisitor != null)
                {
                    customVisitor.Visit(ref context);
                }
                else if (CanVisit(obj))
                {
                    VisitObject(obj, context.Descriptor, true);
                }
                break;
            }
        }
        /// <summary>
        /// Visits the specified object.
        /// </summary>
        /// <param name="obj">The object.</param>
        /// <param name="descriptor">The descriptor.</param>
        /// <exception cref="System.ArgumentNullException">
        /// obj
        /// or
        /// descriptor
        /// </exception>
        /// <exception cref="System.ArgumentException">Descriptor [{0}] type doesn't correspond to object type [{1}].ToFormat(descriptor.Type, obj.GetType())</exception>
        protected void Visit(object obj, ITypeDescriptor descriptor)
        {
            if (obj == null)
            {
                VisitNull();
                return;
            }

            var objectType = obj.GetType();

            if (descriptor == null || descriptor.Type != objectType)
            {
                descriptor = TypeDescriptorFactory.Find(objectType);
            }

            if (descriptor is NullableDescriptor)
            {
                descriptor = TypeDescriptorFactory.Find(((NullableDescriptor)descriptor).UnderlyingType);
            }

            context.Instance   = obj;
            context.Descriptor = (ObjectDescriptor)descriptor;

            switch (descriptor.Category)
            {
            case DescriptorCategory.Primitive:
                VisitPrimitive(obj, (PrimitiveDescriptor)descriptor);
                break;

            default:
                if (CanVisit(obj))
                {
                    IDataCustomVisitor customVisitor;
                    if (!mapTypeToCustomVisitors.TryGetValue(objectType, out customVisitor) && CustomVisitors.Count > 0)
                    {
                        for (int i = CustomVisitors.Count - 1; i >= 0; i--)
                        {
                            var dataCustomVisitor = CustomVisitors[i];
                            if (dataCustomVisitor.CanVisit(objectType))
                            {
                                customVisitor = dataCustomVisitor;
                                mapTypeToCustomVisitors.Add(objectType, dataCustomVisitor);
                                break;
                            }
                        }
                    }

                    if (customVisitor != null)
                    {
                        customVisitor.Visit(ref context);
                    }
                    else
                    {
                        VisitObject(obj, context.Descriptor, true);
                    }
                }
                break;
            }
        }
 public virtual void VisitArray(Array array, ArrayDescriptor descriptor)
 {
     for (int i = 0; i < array.Length; i++)
     {
         var value = array.GetValue(i);
         CurrentPath.Push(descriptor, i);
         VisitArrayItem(array, descriptor, i, value, value == null ? null : TypeDescriptorFactory.Find(value.GetType()));
         CurrentPath.Pop();
     }
 }
Exemple #5
0
 /// <inheritdoc />
 public virtual void VisitArray(Array array, ArrayDescriptor descriptor)
 {
     for (var i = 0; i < array.Length; i++)
     {
         var value = array.GetValue(i);
         CurrentPath.Push(descriptor, i);
         VisitArrayItem(array, descriptor, i, value, TypeDescriptorFactory.Find(value?.GetType() ?? descriptor.ElementType));
         CurrentPath.Pop();
     }
 }
Exemple #6
0
        public virtual void VisitCollection(IEnumerable collection, CollectionDescriptor descriptor)
        {
            int i = 0;

            foreach (var item in collection)
            {
                CurrentPath.Push(descriptor, i);
                VisitCollectionItem(collection, descriptor, i, item, TypeDescriptorFactory.Find(item?.GetType() ?? descriptor.ElementType));
                CurrentPath.Pop();
                i++;
            }
        }
        public virtual void VisitDictionary(object dictionary, DictionaryDescriptor descriptor)
        {
            foreach (var keyValue in descriptor.GetEnumerator(dictionary))
            {
                var key             = keyValue.Key;
                var keyDescriptor   = keyValue.Key == null ? null : TypeDescriptorFactory.Find(keyValue.Key.GetType());
                var value           = keyValue.Value;
                var valueDescriptor = keyValue.Value == null ? null : TypeDescriptorFactory.Find(keyValue.Value.GetType());

                CurrentPath.Push(descriptor, key);
                VisitDictionaryKeyValue(dictionary, descriptor, key, keyDescriptor, value, valueDescriptor);
                CurrentPath.Pop();
            }
        }
Exemple #8
0
        /// <inheritdoc />
        public virtual void VisitCollection(IEnumerable collection, CollectionDescriptor descriptor)
        {
            var i = 0;

            // Make a copy in case VisitCollectionItem mutates something
            var items = collection.Cast <object>().ToList();

            foreach (var item in items)
            {
                CurrentPath.Push(descriptor, i);
                VisitCollectionItem(collection, descriptor, i, item, TypeDescriptorFactory.Find(item?.GetType() ?? descriptor.ElementType));
                CurrentPath.Pop();
                i++;
            }
        }
Exemple #9
0
        /// <inheritdoc />
        public virtual void VisitDictionary(object dictionary, DictionaryDescriptor descriptor)
        {
            // Make a copy in case VisitCollectionItem mutates something
            var items = descriptor.GetEnumerator(dictionary).ToList();

            foreach (var keyValue in items)
            {
                var key             = keyValue.Key;
                var keyDescriptor   = TypeDescriptorFactory.Find(keyValue.Key?.GetType() ?? descriptor.KeyType);
                var value           = keyValue.Value;
                var valueDescriptor = TypeDescriptorFactory.Find(keyValue.Value?.GetType() ?? descriptor.ValueType);

                CurrentPath.Push(descriptor, key);
                VisitDictionaryKeyValue(dictionary, descriptor, key, keyDescriptor, value, valueDescriptor);
                CurrentPath.Pop();
            }
        }
        public override void Initialize()
        {
            base.Initialize();

            TypeFactory = new TypeDescriptorFactory();
            var assetDesc = TypeFactory.Find(typeof(TestAssetUpdate));
            memberMyClass = assetDesc.Members.FirstOrDefault(member => member.Name == "MyClass");

            if (session != null)
            {
                session.Dispose();
                dependencyManager.Dispose();
            }

            package = new Package();
            session = new PackageSession(package);
            dependencyManager = new AssetDependencyManager(session);
            assetUpdater = new AssetUpdater(dependencyManager);
        }