From 2dd9eafd67e0474fa3798313de34648baa18ec57 Mon Sep 17 00:00:00 2001 From: DocSvartz Date: Tue, 14 Jan 2025 15:13:54 +0500 Subject: [PATCH 1/4] add ignore Member filter function --- .../Adapters/ReadOnlyInterfaceAdapter.cs | 2 +- src/Mapster/Utils/DynamicTypeGenerator.cs | 46 +++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/Mapster/Adapters/ReadOnlyInterfaceAdapter.cs b/src/Mapster/Adapters/ReadOnlyInterfaceAdapter.cs index 3703c281..3b22f8d8 100644 --- a/src/Mapster/Adapters/ReadOnlyInterfaceAdapter.cs +++ b/src/Mapster/Adapters/ReadOnlyInterfaceAdapter.cs @@ -33,7 +33,7 @@ protected override Expression CreateInstantiationExpression(Expression source, E if (arg.GetConstructUsing() != null) return base.CreateInstantiationExpression(source, destination, arg); - var destType = DynamicTypeGenerator.GetTypeForInterface(arg.DestinationType, arg.Settings.Includes.Count > 0); + var destType = DynamicTypeGenerator.GetTypeForInterface(arg.DestinationType, arg.Settings.Includes.Count > 0, arg.Settings.Ignore); if (destType == null) return base.CreateInstantiationExpression(source, destination, arg); var ctor = destType.GetConstructors()[0]; diff --git a/src/Mapster/Utils/DynamicTypeGenerator.cs b/src/Mapster/Utils/DynamicTypeGenerator.cs index 7e901417..47f9e4fc 100644 --- a/src/Mapster/Utils/DynamicTypeGenerator.cs +++ b/src/Mapster/Utils/DynamicTypeGenerator.cs @@ -22,6 +22,16 @@ internal static class DynamicTypeGenerator private static readonly ConcurrentDictionary _generated = new ConcurrentDictionary(); private static int _generatedCounter; + private static IgnoreDictionary? ignoreMembers; + + public static Type? GetTypeForInterface(Type interfaceType, bool ignoreError, IgnoreDictionary ignorMembers) + { + ignoreMembers = ignorMembers; + + return GetTypeForInterface(interfaceType, ignoreError); + + } + public static Type? GetTypeForInterface(Type interfaceType, bool ignoreError) { try @@ -86,13 +96,14 @@ private static Type CreateTypeForInterface(Type interfaceType) if (hasReadonlyProps) { - var ctorBuilder = builder.DefineConstructor(MethodAttributes.Public, + var filteredArgs = DropIgnorMemebers(args); + var ctorBuilder = builder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, - args.Select(it => it.FieldType).ToArray()); + filteredArgs.Select(it => it.FieldType).ToArray()); var ctorIl = ctorBuilder.GetILGenerator(); - for (var i = 0; i < args.Count; i++) + for (var i = 0; i < filteredArgs.Count; i++) { - var arg = args[i]; + var arg = filteredArgs[i]; ctorBuilder.DefineParameter(i + 1, ParameterAttributes.None, arg.Name.Substring(1)); ctorIl.Emit(OpCodes.Ldarg_0); ctorIl.Emit(OpCodes.Ldarg_S, i + 1); @@ -175,5 +186,30 @@ private static void CreateMethod(TypeBuilder builder, MethodInfo interfaceMethod builder.DefineMethodOverride(classMethod, interfaceMethod); } + + private static List DropIgnorMemebers(List fields) + { + if (ignoreMembers != null) + { + var ignoreFields = ignoreMembers.Select(x => x.Key).ToArray(); + var filtered = new List(); + + if (ignoreFields.Length == 0) + return fields; + + foreach (var item in fields) + { + foreach (var check in ignoreFields) + { + if (item.Name != $"_{MapsterHelper.CamelCase(check)}") + filtered.Add(item); + } + } + + return filtered; + } + + return fields; + } } -} +} \ No newline at end of file From 398467c4bc967138d07856e9b8613644228bb300 Mon Sep 17 00:00:00 2001 From: DocSvartz Date: Tue, 14 Jan 2025 15:15:32 +0500 Subject: [PATCH 2/4] rename --- src/Mapster/Utils/DynamicTypeGenerator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mapster/Utils/DynamicTypeGenerator.cs b/src/Mapster/Utils/DynamicTypeGenerator.cs index 47f9e4fc..a32878d3 100644 --- a/src/Mapster/Utils/DynamicTypeGenerator.cs +++ b/src/Mapster/Utils/DynamicTypeGenerator.cs @@ -96,7 +96,7 @@ private static Type CreateTypeForInterface(Type interfaceType) if (hasReadonlyProps) { - var filteredArgs = DropIgnorMemebers(args); + var filteredArgs = DropIgnoredMemebers(args); var ctorBuilder = builder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, filteredArgs.Select(it => it.FieldType).ToArray()); @@ -187,7 +187,7 @@ private static void CreateMethod(TypeBuilder builder, MethodInfo interfaceMethod builder.DefineMethodOverride(classMethod, interfaceMethod); } - private static List DropIgnorMemebers(List fields) + private static List DropIgnoredMemebers(List fields) { if (ignoreMembers != null) { From 660caa2ebf91c7b1acc0302364a7d564d250313a Mon Sep 17 00:00:00 2001 From: DocSvartz Date: Tue, 14 Jan 2025 15:17:42 +0500 Subject: [PATCH 3/4] add test --- src/Mapster.Tests/WhenMappingToInterface.cs | 40 +++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/Mapster.Tests/WhenMappingToInterface.cs b/src/Mapster.Tests/WhenMappingToInterface.cs index 00af2104..0f5b5cc6 100644 --- a/src/Mapster.Tests/WhenMappingToInterface.cs +++ b/src/Mapster.Tests/WhenMappingToInterface.cs @@ -289,6 +289,46 @@ public void MappingToInterface_VerifyReadonlyPropsInterfaceRule() ); } + /// + /// https://github.com/MapsterMapper/Mapster/issues/723 + /// + [TestMethod] + public void MappingToIntefaceWithIgnorePrivateSetProperty() + { + TypeAdapterConfig + .NewConfig() + .TwoWays() + .Ignore(dest => dest.Ignore); + + InterfaceDestination723 dataDestination = new Data723() { Inter = "IterDataDestination", Ignore = "IgnoreDataDestination" }; + + Should.NotThrow(() => + { + var isourse = dataDestination.Adapt(); + var idestination = dataDestination.Adapt(); + }); + + } + + public interface InterfaceDestination723 + { + public string Inter { get; set; } + public string Ignore { get; } + } + + public interface InterfaceSource723 + { + public string Inter { get; set; } + } + + private class Data723 : InterfaceSource723, InterfaceDestination723 + { + public string Ignore { get; set; } + + public string Inter { get; set; } + } + + public interface IInheritedDtoWithoutProperties : IInheritedDto { } From ecc41b5da95fbdac7fb42a5fb2763e3347e04497 Mon Sep 17 00:00:00 2001 From: DocSvartz Date: Wed, 15 Jan 2025 05:25:14 +0500 Subject: [PATCH 4/4] refactoring --- src/Mapster/Utils/DynamicTypeGenerator.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Mapster/Utils/DynamicTypeGenerator.cs b/src/Mapster/Utils/DynamicTypeGenerator.cs index a32878d3..72572829 100644 --- a/src/Mapster/Utils/DynamicTypeGenerator.cs +++ b/src/Mapster/Utils/DynamicTypeGenerator.cs @@ -189,14 +189,12 @@ private static void CreateMethod(TypeBuilder builder, MethodInfo interfaceMethod private static List DropIgnoredMemebers(List fields) { - if (ignoreMembers != null) - { + if (ignoreMembers == null || ignoreMembers.Count == 0) + return fields; + var ignoreFields = ignoreMembers.Select(x => x.Key).ToArray(); var filtered = new List(); - if (ignoreFields.Length == 0) - return fields; - foreach (var item in fields) { foreach (var check in ignoreFields) @@ -207,9 +205,6 @@ private static List DropIgnoredMemebers(List fields) } return filtered; - } - - return fields; } } } \ No newline at end of file