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)); }
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)); }
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); }
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); }