Beispiel #1
0
        public void SetObjectData(ref object obj, IObjectGraphNode node)
        {
            Type objType  = obj.GetType();
            Type elemType = objType.GetGenericArguments()[0];

            IGraphNode comparerData = node["comparer"];

            if (comparerData != null)
            {
                Type comparerType   = typeof(IEqualityComparer <>).MakeGenericType(elemType);
                var  comparerObject = comparerData.RebuildObject(comparerType);
                var  f = objType.GetField("m_comparer", BindingFlags.NonPublic | BindingFlags.Instance);
                f.SetValue(obj, comparerObject);
            }

            ISequenceGraphNode elements = node["elements"] as ISequenceGraphNode;

            if (elements != null)
            {
                var m = objType.GetMethod("UnionWith");
                var a = Array.CreateInstance(elemType, elements.Length);
                elements.Select(e => e.RebuildObject(elemType)).ToArray().CopyTo(a, 0);
                m.Invoke(obj, new object[] { a });
            }
        }
Beispiel #2
0
        public void SetObjectData(ref object obj, IObjectGraphNode node)
        {
            Type objType  = obj.GetType();
            Type elemType = TypeTools.GetGenericArguments(objType)[0];

            IGraphNode comparerData = node["comparer"];

            if (comparerData != null)
            {
                Type comparerType = typeof(IEqualityComparer <>).MakeGenericType(elemType);
                var  comparer     = comparerData.RebuildObject(comparerType);
                objType.GetConstructor(false, comparerType).Invoke(obj, new[] { comparer });
            }
            else
            {
                objType.GetConstructor(false).Invoke(obj, null);
            }

            ISequenceGraphNode elements = node["elements"] as ISequenceGraphNode;

            if (elements != null)
            {
                var m = TypeTools.GetRuntimeMethod(objType, "UnionWith");
                var a = Array.CreateInstance(elemType, elements.Length);
                elements.Select(e => e.RebuildObject(elemType)).ToArray().CopyTo(a, 0);
                m.Invoke(obj, new object[] { a });
            }
        }
            public override object ExtractObject(Type requestedType)
            {
                object buildObject;

                if (IsReferedMultipleTimes)
                {
                    if (ParentGraph.TryGetObjectForRefId(RefId, out buildObject))
                    {
                        return(buildObject);
                    }
                }

                Type typeToBuild = requestedType;

                if (ObjectType != null)
                {
                    Type myType = ObjectType.ClassType;
                    if (requestedType != null && !requestedType.IsAssignableFrom(myType))
                    {
                        throw new Exception("Unable to build object. Requested on type but data has another type");                             //TODO better exception
                    }
                    typeToBuild = myType;
                }

                if (typeToBuild == null)
                {
                    throw new Exception("Missing type information. Unable to build object");                            //TODO better exception
                }
                if (typeToBuild.IsAbstract || typeToBuild.IsInterface)
                {
                    throw new Exception("Cannot create a direct instance of a abstract or interface");                          //TODO better exception
                }
                if (typeToBuild.IsArray || typeToBuild.IsPrimitiveData())
                {
                    //Handle Boxed Value Types
                    IGraphNode boxedValue = m_fields[DEFAULT_BOXED_VALUE_FIELD_NAME];
                    return(boxedValue.RebuildObject(typeToBuild));
                }

                buildObject = SerializationServices.GetUninitializedObject(typeToBuild);
                ParentGraph.LinkObjectToNode(this, buildObject);

                var surrogate = SerializationServices.GetDefaultSerializationSurrogate(typeToBuild);

                surrogate.SetObjectData(ref buildObject, this);
                return(buildObject);
            }