public async Task MapPropertiesAsync <TId, TDynamicDto>(IEntity <TId> entity, TDynamicDto dto, Func <IEntity <TId>, TDynamicDto, EntityPropertyDto, PropertyInfo, Task> action) { var dynamicProperties = (await DtoTypeBuilder.GetEntityPropertiesAsync(entity.GetType())) .Where(p => p.Source == MetadataSourceType.UserDefined).ToList(); var dtoProps = dto.GetType().GetProperties(); foreach (var property in dynamicProperties) { var dtoProp = dtoProps.FirstOrDefault(p => p.Name == property.Name); if (dtoProp != null) { await action(entity, dto, property, dtoProp); } } }
public async Task <object> GetEntityPropertyAsync <TEntity, TId>(TEntity entity, string propertyName) where TEntity : class, IEntity <TId> { var dynamicProperty = (await DtoTypeBuilder.GetEntityPropertiesAsync(entity.GetType())) .FirstOrDefault(p => p.Source == MetadataSourceType.UserDefined && p.Name == propertyName); if (dynamicProperty == null) { return(null); } var serializedValue = await GetValueAsync(entity, dynamicProperty); if (serializedValue == null) { return(null); } Type simpleType = null; switch (dynamicProperty.DataType) { case DataTypes.EntityReference: { var entityConfig = _entityConfigurationStore.Get(dynamicProperty.EntityType); var id = SerializationManager.DeserializeProperty(entityConfig.IdType, serializedValue); if (id == null) { return(null); } return(await _dynamicRepository.GetAsync(entityConfig.EntityType, id.ToString())); } case DataTypes.Boolean: simpleType = typeof(bool?); break; case DataTypes.Guid: simpleType = typeof(Guid?); break; case DataTypes.String: simpleType = typeof(string); break; case DataTypes.Date: case DataTypes.DateTime: simpleType = typeof(DateTime?); break; case DataTypes.Number: { switch (dynamicProperty.DataFormat) { case NumberFormats.Int32: simpleType = typeof(int?); break; case NumberFormats.Int64: simpleType = typeof(Int64?); break; case NumberFormats.Double: simpleType = typeof(double?); break; case NumberFormats.Float: simpleType = typeof(float?); break; } break; } case DataTypes.Time: simpleType = typeof(TimeSpan?); break; case DataTypes.Object: simpleType = typeof(string); break; } var rawValue = serializedValue != null && simpleType != null ? SerializationManager.DeserializeProperty(simpleType, serializedValue) : null; return(rawValue); }