Skip to content

Commit baedf16

Browse files
authored
Merge pull request #649 from DocSvartz/add-InterfaceNonPublicSetterAdapter
FIx Issue #537 - Step 3 - Separate Adapter for Interface with readolny props from RecordTypeAdapter
2 parents bdfe266 + db35b17 commit baedf16

File tree

4 files changed

+51
-25
lines changed

4 files changed

+51
-25
lines changed

src/Mapster/Adapters/ClassAdapter.cs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,7 @@ protected override bool CanInline(Expression source, Expression? destination, Co
5353
protected override Expression CreateInstantiationExpression(Expression source, Expression? destination, CompileArgument arg)
5454
{
5555
//new TDestination(src.Prop1, src.Prop2)
56-
57-
///
58-
//bool IsEnableNonPublicMembersAndNotPublicCtorWithoutParams(CompileArgument arg)
59-
//{
60-
// if (arg.Settings.EnableNonPublicMembers == null)
61-
// return false;
62-
// if (arg.Settings.EnableNonPublicMembers == false)
63-
// return false;
64-
// else
65-
// {
66-
// if (arg.DestinationType.GetConstructors().Any(x => x.GetParameters() != null))
67-
// {
68-
// return true;
69-
// }
70-
// }
71-
// return false;
72-
//}
73-
56+
7457
if (arg.GetConstructUsing() != null || arg.Settings.MapToConstructor == null)
7558
return base.CreateInstantiationExpression(source, destination, arg);
7659

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Mapster.Utils;
2+
using System.Linq;
3+
using System.Linq.Expressions;
4+
5+
namespace Mapster.Adapters
6+
{
7+
internal class ReadOnlyInterfaceAdapter : ClassAdapter
8+
{
9+
protected override int Score => -148;
10+
11+
protected override bool CanMap(PreCompileArgument arg)
12+
{
13+
return arg.DestinationType.IsInterface;
14+
}
15+
16+
protected override bool CanInline(Expression source, Expression? destination, CompileArgument arg)
17+
{
18+
if (base.CanInline(source, destination, arg))
19+
return true;
20+
else
21+
return false;
22+
23+
}
24+
25+
protected override Expression CreateInstantiationExpression(Expression source, Expression? destination, CompileArgument arg)
26+
{
27+
var destintionType = arg.DestinationType;
28+
var props = destintionType.GetFieldsAndProperties().ToList();
29+
30+
//interface with readonly props
31+
if (props.Any(p => p.SetterModifier != AccessModifier.Public))
32+
{
33+
if (arg.GetConstructUsing() != null)
34+
return base.CreateInstantiationExpression(source, destination, arg);
35+
36+
var destType = DynamicTypeGenerator.GetTypeForInterface(arg.DestinationType, arg.Settings.Includes.Count > 0);
37+
if (destType == null)
38+
return base.CreateInstantiationExpression(source, destination, arg);
39+
var ctor = destType.GetConstructors()[0];
40+
var classModel = GetConstructorModel(ctor, false);
41+
var classConverter = CreateClassConverter(source, classModel, arg);
42+
return CreateInstantiationExpression(source, classConverter, arg);
43+
}
44+
else
45+
return base.CreateInstantiationExpression(source,destination, arg);
46+
}
47+
48+
}
49+
}

src/Mapster/TypeAdapterConfig.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ private static List<TypeAdapterRule> CreateRuleTemplate()
2323
new PrimitiveAdapter().CreateRule(), //-200
2424
new ClassAdapter().CreateRule(), //-150
2525
new RecordTypeAdapter().CreateRule(), //-149
26+
new ReadOnlyInterfaceAdapter().CreateRule(), // -148
2627
new CollectionAdapter().CreateRule(), //-125
2728
new DictionaryAdapter().CreateRule(), //-124
2829
new ArrayAdapter().CreateRule(), //-123

src/Mapster/Utils/ReflectionUtils.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,6 @@ public static bool IsRecordType(this Type type)
183183

184184
#endregion SupportingСurrentBehavior for Config Clone and Fork
185185

186-
var props = type.GetFieldsAndProperties().ToList();
187-
188-
//interface with readonly props
189-
if (type.GetTypeInfo().IsInterface &&
190-
props.Any(p => p.SetterModifier != AccessModifier.Public))
191-
return true;
192-
193186
if(RecordTypeIdentityHelper.IsRecordType(type))
194187
return true;
195188

0 commit comments

Comments
 (0)