Exemple #1
0
        public static SerializationTypeConfiguration <T> ConfigureProperty <T, TProp>(this SerializationTypeConfiguration <T> typeConfiguration, Expression <Func <T, TProp> > expr, Action <SerializationPropertyConfiguration> configBuilder)
        {
            var propertyInfo = GetPropertyInfoFromExpression(expr);
            var config       = new SerializationPropertyConfiguration();

            configBuilder(config);
            typeConfiguration.AddConfiguration(propertyInfo, config);
            return(typeConfiguration);
        }
        ColumnWriterDetails GetDecimalColumnWriterDetails(bool isNullable, uint columnId, PropertyInfo propertyInfo, Func <object, decimal?> valueGetter, SerializationPropertyConfiguration propertyConfiguration)
        {
            var precision = propertyConfiguration?.DecimalPrecision ?? _defaultDecimalPrecision;
            var scale     = propertyConfiguration?.DecimalScale ?? _defaultDecimalScale;

            var state        = new List <decimal?>();
            var columnWriter = new DecimalWriter(isNullable, _shouldAlignNumericValues, precision, scale, _bufferFactory, columnId);

            return(new ColumnWriterDetails
            {
                PropertyName = propertyInfo.Name,
                ColumnWriter = columnWriter,
                AddValueToState = classInstance =>
                {
                    var value = valueGetter(classInstance);
                    state.Add(value);
                },
                WriteValuesFromState = () =>
                {
                    columnWriter.AddBlock(state);
                    state.Clear();
                },
                ColumnType = new Protocol.ColumnType
                {
                    Kind = Protocol.ColumnTypeKind.Decimal,
                    Precision = (uint)precision,
                    Scale = (uint)scale
                }
            });
        }
        ColumnWriterDetails GetColumnWriterDetails(PropertyInfo propertyInfo, uint columnId, SerializationPropertyConfiguration propertyConfiguration)
        {
            var propertyType = propertyInfo.PropertyType;

            //TODO move this to a pattern match switch
            if (propertyType == typeof(int))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <int>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Int));
            }
            if (propertyType == typeof(long))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <long>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Long));
            }
            if (propertyType == typeof(short))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <short>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Short));
            }
            if (propertyType == typeof(uint))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <uint>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Int));
            }
            if (propertyType == typeof(ulong))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => (long)GetValue <ulong>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Long));
            }
            if (propertyType == typeof(ushort))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <ushort>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Short));
            }
            if (propertyType == typeof(int?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <int?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Int));
            }
            if (propertyType == typeof(long?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <long?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Long));
            }
            if (propertyType == typeof(short?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <short?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Short));
            }
            if (propertyType == typeof(uint?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <uint?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Int));
            }
            if (propertyType == typeof(ulong?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => (long?)GetValue <ulong?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Long));
            }
            if (propertyType == typeof(ushort?))
            {
                return(GetColumnWriterDetails(GetLongColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <ushort?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Short));
            }
            if (propertyType == typeof(byte))
            {
                return(GetColumnWriterDetails(GetByteColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <byte>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Byte));
            }
            if (propertyType == typeof(sbyte))
            {
                return(GetColumnWriterDetails(GetByteColumnWriter(false, columnId), propertyInfo, classInstance => (byte)GetValue <sbyte>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Byte));
            }
            if (propertyType == typeof(byte?))
            {
                return(GetColumnWriterDetails(GetByteColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <byte?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Byte));
            }
            if (propertyType == typeof(sbyte?))
            {
                return(GetColumnWriterDetails(GetByteColumnWriter(true, columnId), propertyInfo, classInstance => (byte?)GetValue <sbyte?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Byte));
            }
            if (propertyType == typeof(bool))
            {
                return(GetColumnWriterDetails(GetBooleanColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <bool>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Boolean));
            }
            if (propertyType == typeof(bool?))
            {
                return(GetColumnWriterDetails(GetBooleanColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <bool?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Boolean));
            }
            if (propertyType == typeof(float))
            {
                return(GetColumnWriterDetails(GetFloatColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <float>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Float));
            }
            if (propertyType == typeof(float?))
            {
                return(GetColumnWriterDetails(GetFloatColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <float?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Float));
            }
            if (propertyType == typeof(double))
            {
                return(GetColumnWriterDetails(GetDoubleColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <double>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Double));
            }
            if (propertyType == typeof(double?))
            {
                return(GetColumnWriterDetails(GetDoubleColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <double?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Double));
            }
            if (propertyType == typeof(byte[]))
            {
                return(GetColumnWriterDetails(GetBinaryColumnWriter(columnId), propertyInfo, classInstance => GetValue <byte[]>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Binary));
            }
            if (propertyType == typeof(decimal))
            {
                return(GetDecimalColumnWriterDetails(false, columnId, propertyInfo, classInstance => GetValue <decimal>(classInstance, propertyInfo), propertyConfiguration));
            }
            if (propertyType == typeof(decimal?))
            {
                return(GetDecimalColumnWriterDetails(true, columnId, propertyInfo, classInstance => GetValue <decimal?>(classInstance, propertyInfo), propertyConfiguration));
            }
            if (propertyType == typeof(DateTime) && propertyConfiguration != null && propertyConfiguration.SerializeAsDate)
            {
                return(GetColumnWriterDetails(GetDateColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <DateTime>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Date));
            }
            if (propertyType == typeof(DateTime))
            {
                return(GetColumnWriterDetails(GetTimestampColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <DateTime>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Timestamp));
            }
            if (propertyType == typeof(DateTime?) && propertyConfiguration != null && propertyConfiguration.SerializeAsDate)
            {
                return(GetColumnWriterDetails(GetDateColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <DateTime?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Date));
            }
            if (propertyType == typeof(DateTime?))
            {
                return(GetColumnWriterDetails(GetTimestampColumnWriter(true, columnId), propertyInfo, classInstance => GetValue <DateTime?>(classInstance, propertyInfo), Protocol.ColumnTypeKind.Timestamp));
            }
            if (propertyType == typeof(DateTimeOffset))
            {
                return(GetColumnWriterDetails(GetTimestampColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <DateTimeOffset>(classInstance, propertyInfo).UtcDateTime, Protocol.ColumnTypeKind.Timestamp));
            }
            if (propertyType == typeof(DateTimeOffset?))
            {
                return(GetColumnWriterDetails(GetTimestampColumnWriter(false, columnId), propertyInfo, classInstance => GetValue <DateTimeOffset?>(classInstance, propertyInfo)?.UtcDateTime, Protocol.ColumnTypeKind.Timestamp));
            }
            if (propertyType == typeof(string))
            {
                return(GetColumnWriterDetails(GetStringColumnWriter(columnId), propertyInfo, classInstance => GetValue <string>(classInstance, propertyInfo), Protocol.ColumnTypeKind.String));
            }

            throw new NotImplementedException($"Only basic types are supported. Unable to handle type {propertyType}");
        }