Skip to content

Commit 73f818c

Browse files
committed
feat: impliment Map with Type mapping settings ovveride
1 parent 9e1f410 commit 73f818c

8 files changed

Lines changed: 82 additions & 7 deletions

File tree

src/Mapster/Adapters/BaseClassAdapter.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ src is LambdaExpression lambda
4343
from src in sources
4444
select fn(src, destinationMember, arg))
4545
.FirstOrDefault(result => result != null);
46+
if(getter is MemberExpression mem && mem?.Expression?.Type == source.Type)
47+
{
48+
getter = Expression.PropertyOrField(source, mem.Member.Name);
49+
}
50+
51+
var test = resolvers.Where(ValueAccessingStrategy.CustomResolvers.Contains);
4652

4753
if (arg.MapType == MapType.Projection && getter != null)
4854
{
@@ -103,6 +109,10 @@ select fn(src, destinationMember, arg))
103109
var nextResolvers = arg.Settings.Resolvers.Next(arg.Settings.Ignore, (ParameterExpression)source, destinationMember.Name)
104110
.ToList();
105111

112+
var overideSettings = arg.Settings.Resolvers
113+
.Where(x => x.DestinationMemberName == destinationMember.Name && x.OvverideSettings != null)
114+
.Select(x=>x.OvverideSettings).FirstOrDefault();
115+
106116
var propertyModel = new MemberMapping
107117
{
108118
DestinationMember = destinationMember,
@@ -112,6 +122,7 @@ select fn(src, destinationMember, arg))
112122
Source = (ParameterExpression)source,
113123
Destination = (ParameterExpression?)destination,
114124
UseDestinationValue = IsCanUsingDestinationValue(arg, destinationMember),
125+
OverrideSettings = overideSettings
115126
};
116127
if(arg.MapType == MapType.ApplyNullPropagation &&
117128
getter == null && !arg.DestinationType.IsRecordType()
@@ -264,6 +275,7 @@ protected Expression CreateInstantiationExpression(Expression source, ClassMappi
264275
else
265276
getter = member.Getter
266277
.ApplyNullPropagationFromCtor(CreateAdaptExpressionCore(member.Getter, member.DestinationMember.Type, arg, member), arg);
278+
267279

268280

269281
if (member.Ignore.Condition != null)
@@ -282,6 +294,7 @@ protected Expression CreateInstantiationExpression(Expression source, ClassMappi
282294
if (arg.MapType == MapType.MapToTarget && arg.DestinationType.IsRecordType())
283295
getter = TryRestoreRecordMember(member.DestinationMember, recordRestorParamModel, destination) ?? getter;
284296
}
297+
285298
}
286299
arguments.Add(getter);
287300
}

src/Mapster/Models/InvokerModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class InvokerModel
99
public LambdaExpression? Invoker { get; set; }
1010
public string? SourceMemberName { get; set; }
1111
public LambdaExpression? Condition { get; set; }
12+
public TypeAdapterSettings? OvverideSettings { get; set; }
1213
public bool IsChildPath { get; set; }
1314

1415
public InvokerModel? Next(ParameterExpression source, string destMemberName)

src/Mapster/Models/MemberMapping.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ internal class MemberMapping
1313
public ParameterExpression Source;
1414
public ParameterExpression? Destination;
1515
public bool UseDestinationValue;
16+
public TypeAdapterSettings? OverrideSettings;
1617

1718
public bool HasSettings()
1819
{

src/Mapster/TypeAdapterConfig.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,13 @@ internal LambdaExpression CreateInlineMapExpression(Type sourceType, Type destin
474474
arg.Settings.Resolvers.AddRange(mapping.NextResolvers);
475475
arg.Settings.Ignore.Apply(mapping.NextIgnore);
476476
arg.UseDestinationValue = mapping.UseDestinationValue;
477+
478+
if (mapping.OverrideSettings != null)
479+
{
480+
mapping.OverrideSettings.Apply(arg.Settings);
481+
arg.Settings = mapping.OverrideSettings;
482+
}
483+
477484
}
478485

479486
return CreateMapExpression(arg);

src/Mapster/TypeAdapterSetter.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ public TypeAdapterSetter<TDestination> IgnoredRemove(params Expression<Func<TDes
642642
public TypeAdapterSetter<TSource, TDestination> MapOverride<TDestinationMember, TSourceMember>(
643643
Expression<Func<TDestination, TDestinationMember>> member,
644644
Expression<Func<TSource, TSourceMember>> source,
645-
Action<TypeAdapterSetter<TSourceMember, TDestinationMember>>? configAction = null)
645+
Action<OverrideTypesSetter<TSourceMember, TDestinationMember>>? configAction = null)
646646
{
647647
this.CheckCompiled();
648648

@@ -653,20 +653,22 @@ public TypeAdapterSetter<TSource, TDestination> MapOverride<TDestinationMember,
653653
return this;
654654
}
655655

656+
TypeAdapterSettings? overrideSettings = null;
657+
656658
if (configAction != null)
657659
{
658-
var settings = TypeAdapterSetter.CreateMapTypeOverride<TSourceMember, TDestinationMember>();
659-
660-
configAction(settings);
660+
var Tempsetter = new OverrideTypesSetter<TSourceMember, TDestinationMember>();
661+
configAction(Tempsetter);
661662

663+
overrideSettings = Tempsetter.Settings;
662664
}
663665

664-
665666
Settings.Resolvers.Add(new InvokerModel
666667
{
667668
DestinationMemberName = member.GetMemberPath()!,
668669
Invoker = invoker,
669-
Condition = null
670+
Condition = null,
671+
OvverideSettings = overrideSettings
670672
});
671673
return this;
672674
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Mapster.Utils;
2+
using System;
3+
using System.Linq.Expressions;
4+
5+
namespace Mapster
6+
{
7+
[AdaptWith(AdaptDirectives.DestinationAsRecord)]
8+
public class OverrideTypesSetter : TypeAdapterSetter
9+
{
10+
protected OverrideTypesSettings _Settings { get => (OverrideTypesSettings)Settings; }
11+
12+
public OverrideTypesSetter() : this (new OverrideTypesSettings (), null) { }
13+
public OverrideTypesSetter(TypeAdapterSettings settings, TypeAdapterConfig config) : base(settings, config) { }
14+
}
15+
16+
public class OverrideTypesSetter<TSource, TDestination> : OverrideTypesSetter
17+
{
18+
public OverrideTypesSetter<TSource, TDestination> DropSettings(params Expression<Func<TypeAdapterSettings, object>>[] settings)
19+
{
20+
foreach (var member in settings)
21+
{
22+
_Settings.DropSettings.Add(member.GetMemberPath()!);
23+
}
24+
25+
return this;
26+
}
27+
28+
public TypeAdapterSetter<TSource, TDestination> Configurate()
29+
{
30+
return new TypeAdapterSetter<TSource, TDestination>(this.Settings,this.Config);
31+
}
32+
}
33+
34+
35+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System.Collections.Generic;
2+
3+
namespace Mapster
4+
{
5+
[AdaptWith(AdaptDirectives.DestinationAsRecord)]
6+
public class OverrideTypesSettings : TypeAdapterSettings
7+
{
8+
public List<string> DropSettings
9+
{
10+
get => Get(nameof(DropSettings), () => new List<string>());
11+
}
12+
13+
14+
15+
}
16+
}

src/Mapster/Utils/ExpressionEx.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ public static Expression Not(Expression exp)
150150
public static Expression Apply(this LambdaExpression lambda, MapType mapType, params Expression[] exps)
151151
{
152152
return lambda.Apply(mapType != MapType.Projection, exps);
153-
}
153+
}
154154

155155
public static Expression Apply(this LambdaExpression lambda, ParameterExpression p1, ParameterExpression? p2 = null)
156156
{

0 commit comments

Comments
 (0)