Exemplo n.º 1
0
        public virtual IFoxPropertyConverter MakePropertyConverter(Type targetType, IEntityReferenceResolver entityReferenceResolver)
        {
            var convertedList = Activator.CreateInstance(targetType) as IList;

            for (var i = 0; i < _values.Count; i++)
            {
                var value = _values[i];
                if (value is IFoxReferenceType)
                {
                    // Add null as a placeholder.
                    // Replace it with the Entity reference once resolved.
                    convertedList.Add(null);
                    var iCopy = i;
                    AssignReferenceDelegate referenceAssignmentDelegate = delegate(Entity reference)
                    {
                        convertedList[iCopy] = reference;
                    };
                    entityReferenceResolver.RequestReference(referenceAssignmentDelegate, (value as IFoxReferenceType).ReferencedEntityAddress);
                }
                else if (value is IFoxValueType)
                {
                    convertedList.Add((value as IFoxValueType).Unwrap());
                }
            }
            return(new ValueTypeConverter(convertedList));
        }
Exemplo n.º 2
0
        public IFoxPropertyConverter MakePropertyConverter(Type targetType, IEntityReferenceResolver entityReferenceResolver)
        {
            var convertedDictionary = Activator.CreateInstance(targetType) as IDictionary;

            foreach (var kvp in _map)
            {
                var value = kvp.Value;
                if (value is IFoxReferenceType)
                {
                    // Add null as a placeholder.
                    // Replace it with the Entity reference once resolved.
                    convertedDictionary.Add(kvp.Key.Literal, null);
                    var keyCopy = kvp.Key.Literal;
                    AssignReferenceDelegate referenceAssignmentDelegate = delegate(Entity reference)
                    {
                        convertedDictionary[keyCopy] = reference;
                    };
                    entityReferenceResolver.RequestReference(referenceAssignmentDelegate, (value as IFoxReferenceType).ReferencedEntityAddress);
                }
                else if (value is IFoxValueType)
                {
                    convertedDictionary.Add(kvp.Key.Literal, (value as IFoxValueType).Unwrap());
                }
            }
            return(new ValueTypeConverter(convertedDictionary));
        }
Exemplo n.º 3
0
        public override IFoxPropertyConverter MakePropertyConverter(Type targetType, IEntityReferenceResolver entityReferenceResolver)
        {
            var value = _values[0];

            if (value is IFoxReferenceType)
            {
                return(new ReferenceTypeConverter((value as IFoxReferenceType).ReferencedEntityAddress, entityReferenceResolver));
            }
            if (value is IFoxValueType)
            {
                return(new ValueTypeConverter((value as IFoxValueType).Unwrap()));
            }
            throw new ArgumentOutOfRangeException("Value was neither IFoxReferenceType nor IFoxType.");
        }
 public ReferenceTypeConverter(ulong referencedEntityAddress, IEntityReferenceResolver entityReferenceResolver)
 {
     entityReferenceResolver.RequestReference(AssignReference, referencedEntityAddress);
 }
Exemplo n.º 5
0
 public object Unpack(IEntityReferenceResolver entityReferenceResolver)
 {
     return(Value);
 }
        private static void ImportEntityProperty(Entity entityInstance, FoxProperty foxProperty, IEntityReferenceResolver entityReferenceResolver)
        {
            var entityPropertyAndFieldInfo =
                FindMatchingEntityPropertyAndFieldInfo(entityInstance.GetType(), foxProperty.Name);

            var converter = foxProperty.Container.MakePropertyConverter(entityPropertyAndFieldInfo.Item2.FieldType, entityReferenceResolver);

            converter.ConvertFromFox(entityInstance, entityPropertyAndFieldInfo.Item2);
        }
 private static void ImportEntityProperties(Entity entityInstance, FoxEntity foxEntityData, IEntityReferenceResolver entityReferenceResolver)
 {
     foreach (var foxProperty in foxEntityData.StaticProperties)
     //.Concat(foxEntityData.DynamicProperties)) -- Dynamic properties don't work yet.
     {
         try
         {
             ImportEntityProperty(entityInstance, foxProperty, entityReferenceResolver);
         }
         catch (Exception e)
         {
             Debug.LogError(e);
         }
     }
 }
        public static Entity MakeEntity(FoxEntity foxData, Dictionary <string, Type> entityTypes, ConcurrentDictionary <string, FoxEntity> unimplementedTypeTable, IUnityThreadCommandDispatcher unityThreadDispatcher, IEntityReferenceResolver entityReferenceResolver)
        {
            // Get Entity type.
            Type entityType;

            if (!entityTypes.TryGetValue(foxData.ClassName, out entityType) && !unimplementedTypeTable.ContainsKey(foxData.ClassName))
            {
                Debug.LogWarning("Class '" + foxData.ClassName + "' not found in entityTypes.");
                unimplementedTypeTable.TryAdd(foxData.ClassName, foxData);
                return(null);
            }

            // Get new Entity instance.
            // We can't make new GameObjects outside the main thread, so dispatch a request for one to the Unity thread.
            Entity entityInstance = null;
            var    waitEvent      = unityThreadDispatcher.DispatchCommand(new CreateEntity(entityType,
                                                                                           newEntity => entityInstance = newEntity));

            // Wait for our command to be executed by the Unity thread.
            waitEvent.WaitOne();
            entityReferenceResolver.RegisterReference(foxData.Address, entityInstance);

            // Load properties.
            ImportEntityProperties(entityInstance, foxData, entityReferenceResolver);
            return(entityInstance);
        }