/// <summary> /// Register a manual mapping information from source to target /// </summary> /// <typeparam name="TSource">Source type</typeparam> /// <typeparam name="TTarget">Target type</typeparam> public void RegisterMap <TSource, TTarget>(Action <TSource, TTarget> convert) { var targetType = typeof(TTarget); var sourceType = typeof(TSource); if (!_mappings.ContainsKey(targetType)) { _mappings[targetType] = new Dictionary <Type, MappingInfo>(); } if (!_mappings[targetType].ContainsKey(sourceType)) { _mappings[targetType][sourceType] = new MappingInfo { SourceType = sourceType, TargetType = targetType } } ; _mappings[targetType][sourceType].ManualConvertAction = (source, target) => { convert((TSource)source, (TTarget)target); }; }
/// <summary> /// Register mapping information from source to target /// </summary> /// <typeparam name="TSource">Source type</typeparam> /// <typeparam name="TTarget">Target type</typeparam> public void RegisterAutoMap <TSource, TTarget>(Action <TSource, TTarget> additionalMapping = null) { var targetType = typeof(TTarget); var sourceType = typeof(TSource); MappingInfo <TSource, TTarget> info = new MappingInfo <TSource, TTarget> { SourceType = sourceType, TargetType = targetType }; var sourcePoperties = sourceType.GetTypeInfo().GetProperties(); var targetPoperties = targetType.GetTypeInfo().GetProperties(e => e.SetMethod != null); List <PropertyMapper> props = new List <PropertyMapper>(); foreach (var targetPoperty in targetPoperties) { bool sourceNullable = false; bool targetNullable = false; var sourceProperty = sourcePoperties.FirstOrDefault( e => e.Name == targetPoperty.Name && e.PropertyType == targetPoperty.PropertyType); if (sourceProperty == null && targetPoperty.PropertyType.GenericTypeArguments.Any() && targetPoperty.PropertyType == typeof(Nullable <>).MakeGenericType(targetPoperty.PropertyType.GenericTypeArguments)) { sourceProperty = sourcePoperties.FirstOrDefault(e => e.Name == targetPoperty.Name && e.PropertyType == targetPoperty.PropertyType.GenericTypeArguments[0]); targetNullable = true; } if (sourceProperty == null) { sourceProperty = sourcePoperties.FirstOrDefault(e => e.Name == targetPoperty.Name && e.PropertyType.GenericTypeArguments.Any() && e.PropertyType == typeof(Nullable <>).MakeGenericType(targetPoperty.PropertyType)); sourceNullable = true; } if (sourceProperty != null) { props.Add(new PropertyMapper { TargetProperty = targetPoperty, SourceProperty = sourceProperty, SourceNullable = sourceNullable, TargetNullable = targetNullable }); } } info.Properties = props; if (!_mappings.ContainsKey(targetType)) { _mappings[targetType] = new Dictionary <Type, MappingInfo>(); } if (_mappings[targetType].ContainsKey(sourceType)) { info.ManualConvertAction = _mappings[targetType][sourceType].ManualConvertAction; } info.SetAdditionalMapping(additionalMapping); _mappings[targetType][sourceType] = info; }