diff --git a/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapExtraPropertiesInvoker.cs b/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapExtraPropertiesInvoker.cs deleted file mode 100644 index f1eb60ec9f..0000000000 --- a/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapExtraPropertiesInvoker.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Linq.Expressions; -using System.Reflection; -using Volo.Abp.Data; -using Volo.Abp.ObjectExtending; - -namespace Volo.Abp.Mapperly; - -public static class MapExtraPropertiesInvoker -{ - private delegate void MapMethodDelegate( - object targetInstance, - IHasExtraProperties source, - IHasExtraProperties destination, - ExtraPropertyDictionary destinationExtraProperty, - MappingPropertyDefinitionChecks? definitionChecks, - string[]? ignoredProperties, - bool mapToRegularProperties); - - private readonly static ConcurrentDictionary<(Type, Type), MapMethodDelegate> Cache = new(); - - private readonly static MethodInfo MethodDefinition = typeof(MapperlyAutoObjectMappingProvider).GetMethod("MapExtraProperties", BindingFlags.Instance | BindingFlags.NonPublic)!; - - public static void Invoke( - object targetInstance, - IHasExtraProperties source, - IHasExtraProperties destination, - ExtraPropertyDictionary destinationExtraProperty, - MappingPropertyDefinitionChecks? definitionChecks = null, - string[]? ignoredProperties = null, - bool mapToRegularProperties = false) - { - var mapExtraProperties = Cache.GetOrAdd((typeof(TSource), typeof(TDestination)), static key => - { - Check.NotNull(MethodDefinition, nameof(MethodDefinition)); - - var genericMethod = MethodDefinition.MakeGenericMethod(key.Item1, key.Item2); - - var targetParam = Expression.Parameter(typeof(object), "target"); - var sourceParam = Expression.Parameter(typeof(IHasExtraProperties), "source"); - var destParam = Expression.Parameter(typeof(IHasExtraProperties), "destination"); - var checksParam = Expression.Parameter(typeof(MappingPropertyDefinitionChecks?), "checks"); - var destinationExtraPropertyParam = Expression.Parameter(typeof(ExtraPropertyDictionary), "destinationExtraProperty"); - var ignoredParam = Expression.Parameter(typeof(string[]), "ignored"); - var mapFlagParam = Expression.Parameter(typeof(bool), "mapFlag"); - - var instanceCast = Expression.Convert(targetParam, typeof(MapperlyAutoObjectMappingProvider)); - - var call = Expression.Call( - instanceCast, - genericMethod, - sourceParam, - destParam, - destinationExtraPropertyParam, - checksParam, - ignoredParam, - mapFlagParam - ); - - var lambda = Expression.Lambda( - call, - targetParam, sourceParam, destParam, destinationExtraPropertyParam, checksParam, ignoredParam, mapFlagParam - ); - - return lambda.Compile(); - }); - - mapExtraProperties(targetInstance, source, destination, destinationExtraProperty, definitionChecks, ignoredProperties, mapToRegularProperties); - } -} diff --git a/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs b/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs index 6e0e36d071..19f677515b 100644 --- a/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs +++ b/framework/src/Volo.Abp.Mapperly/Volo/Abp/Mapperly/MapperlyAutoObjectMappingProvider.cs @@ -102,7 +102,7 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider typeof(IHasExtraProperties).IsAssignableFrom(typeof(TDestination)) && typeof(IHasExtraProperties).IsAssignableFrom(typeof(TSource))) { - MapExtraPropertiesInvoker.Invoke(this, + MapExtraProperties( source!.As(), destination!.As(), destinationExtraProperty, @@ -120,8 +120,6 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider MappingPropertyDefinitionChecks? definitionChecks = null, string[]? ignoredProperties = null, bool mapToRegularProperties = false) - where TSource : IHasExtraProperties - where TDestination : IHasExtraProperties { var result = destinationExtraProperty.IsNullOrEmpty() ? new Dictionary() @@ -130,7 +128,9 @@ public class MapperlyAutoObjectMappingProvider : IAutoObjectMappingProvider if (source.ExtraProperties != null && destination.ExtraProperties != null) { ExtensibleObjectMapper - .MapExtraPropertiesTo( + .MapExtraPropertiesTo( + typeof(TSource), + typeof(TDestination), source.ExtraProperties, result, definitionChecks,