/// <summary> /// Creates a new <see cref="CoreTypeMappingParameters" /> parameter object with the given /// converter composed with any existing converter and set on the new parameter object. /// </summary> /// <param name="converter"> The converter. </param> /// <returns> The new parameter object. </returns> public CoreTypeMappingParameters WithComposedConverter([CanBeNull] ValueConverter converter) => new CoreTypeMappingParameters( ClrType, converter == null ? Converter : converter.ComposeWith(Converter), Comparer, KeyComparer, ValueGeneratorFactory);
public void Can_convert_compose_to_strings() { var converter = ((ValueConverter <Beatles, string>)_enumToNumber.ComposeWith(_intToString)) .ConvertToProviderExpression.Compile(); Assert.Equal("7", converter(Beatles.John)); Assert.Equal("4", converter(Beatles.Paul)); Assert.Equal("1", converter(Beatles.George)); Assert.Equal("-1", converter(Beatles.Ringo)); Assert.Equal("77", converter((Beatles)77)); Assert.Equal("0", converter(default));
/// <summary> /// Creates a new instance of <see cref="TypeMappingInfo" /> with the given <see cref="ValueConverterInfo" />. /// </summary> /// <param name="source"> The source info. </param> /// <param name="builtInConverter"> The converter to apply. </param> protected TypeMappingInfo( [NotNull] TypeMappingInfo source, ValueConverterInfo builtInConverter) { Check.NotNull(source, nameof(source)); Property = source.Property; ModelClrType = source.ModelClrType; ConfiguredProviderClrType = source.ConfiguredProviderClrType; IsRowVersion = source.IsRowVersion; IsKeyOrIndex = source.IsKeyOrIndex; if (source._customConverter != null) { _customConverter = source._customConverter; ValueConverterInfo = new ValueConverterInfo( _customConverter.ModelClrType, builtInConverter.ProviderClrType, i => _customConverter.ComposeWith(builtInConverter.Create()), builtInConverter.MappingHints == null ? _customConverter.MappingHints : builtInConverter.MappingHints.With(_customConverter.MappingHints)); } else { ValueConverterInfo = builtInConverter; } // ReSharper disable once VirtualMemberCallInConstructor var mappingHints = ValueConverterInfo?.MappingHints; Size = source.Size ?? mappingHints?.Size; IsUnicode = source.IsUnicode ?? mappingHints?.IsUnicode; Scale = source.Scale ?? mappingHints?.Scale; Precision = source.Precision ?? mappingHints?.Precision; ProviderClrType = CreateProviderClrType(); }
/// <summary> /// Creates a new instance of <see cref="TypeMappingInfo" /> with the given <see cref="ValueConverterInfo" />. /// </summary> /// <param name="source"> The source info. </param> /// <param name="builtInConverter"> The converter to apply. </param> protected TypeMappingInfo( [NotNull] TypeMappingInfo source, ValueConverterInfo builtInConverter) { Check.NotNull(source, nameof(source)); Property = source.Property; ModelClrType = source.ModelClrType; StoreClrType = source.StoreClrType; IsRowVersion = source.IsRowVersion; IsKeyOrIndex = source.IsKeyOrIndex; if (source._customConverter != null) { _customConverter = source._customConverter; ValueConverterInfo = new ValueConverterInfo( _customConverter.ModelType, builtInConverter.StoreClrType, i => _customConverter.ComposeWith(builtInConverter.Create()), _customConverter.MappingHints.With(builtInConverter.MappingHints)); } else { ValueConverterInfo = builtInConverter; } // ReSharper disable once VirtualMemberCallInConstructor var mappingHints = ValueConverterInfo?.MappingHints ?? default; Size = CalculateSize(mappingHints, source.Size ?? mappingHints.Size); IsUnicode = source.IsUnicode ?? mappingHints.IsUnicode; IsFixedLength = source.IsFixedLength ?? mappingHints.IsFixedLength; Scale = source.Scale ?? mappingHints.Scale; Precision = source.Precision ?? mappingHints.Precision; }
/// <summary> /// Composes the given <see cref="ValueConverter"/> with any already in this mapping /// and returns a new <see cref="ValueConverter"/> combining them together. /// </summary> /// <param name="converter"> The new converter. </param> /// <returns> The composed converter. </returns> protected virtual ValueConverter ComposeConverter([CanBeNull] ValueConverter converter) => converter == null ? Converter : converter.ComposeWith(Converter);