예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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);
        }