Exemple #1
0
        public ClassObjectProxyProperty(Type t, object o, ClassPropertyBag <ObjectContainerProxy> bag)
            : base(t.Name, null, null)
        {
            _wrappedObject = o;
            _bag           = bag;

            ComponentType = t;
        }
Exemple #2
0
        public ClassObjectProxyProperty(Type t, object o, HashSet <Type> primitiveTypes)
            : base(t.Name, null, null)
        {
            _wrappedObject = o;

            _bag = ClassPropertyBagFactory.GetPropertyBagForObject(o, primitiveTypes);

            ComponentType = t;
        }
Exemple #3
0
        public StructObjectProxyProperty(Type t, object o, HashSet <Type> primitiveTypes)
            : base("Shared Component", null, null)
        {
            _wrappedObject = o;

            _bag = new ClassPropertyBag <ObjectContainerProxy>(
                new ClassObjectProxyProperty(o.GetType(), o, primitiveTypes));

            ComponentType = t;
        }
        public static ClassPropertyBag <ObjectContainerProxy> GetPropertyBagForObject(
            object o,
            HashSet <Type> primitiveTypes)
        {
            Type type = o.GetType();

            if (_propertyBagCache.ContainsKey(type))
            {
                return(_propertyBagCache[type]);
            }

            var bag = new ClassPropertyBag <ObjectContainerProxy>();

            bag.AddProperty(new TypeIdClassProperty((ObjectContainerProxy c) => c.o.GetType().Name));

            foreach (var f in type.GetFields(BindingFlags.Public | BindingFlags.Instance))
            {
                try
                {
                    object value = f.GetValue(o);
                    if (value == null)
                    {
                        continue;
                    }

                    if (IsPrimitiveValue(primitiveTypes, f.FieldType))
                    {
                        var objectProperty = typeof(FieldObjectProperty <>).MakeGenericType(f.FieldType);

                        bag.AddProperty((IClassProperty <ObjectContainerProxy>)Activator.CreateInstance(objectProperty, o, f));
                    }
                    // TODO: only class type for now
                    else if (f.FieldType.IsClass)
                    {
                        if (f.FieldType.Name != type.Name)
                        {
                            bag.AddProperty(new ClassObjectProxyProperty(f.FieldType, value, primitiveTypes));
                        }
                    }
                }
                catch (Exception)
                {
                }
            }

            foreach (var f in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                try
                {
                    if (IsPrimitiveValue(primitiveTypes, f.PropertyType))
                    {
                        var objectProperty = typeof(CSharpPropertyObjectProperty <>).MakeGenericType(f.PropertyType);

                        bag.AddProperty((IClassProperty <ObjectContainerProxy>)Activator.CreateInstance(objectProperty, o, f));
                    }
                    // TODO: only class type for now
                }
                catch (Exception)
                {
                }
            }

            _propertyBagCache[type] = bag;

            return(bag);
        }