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