diff --git a/src/Mapster.Tests/WhenMappingNullablePrimitives.cs b/src/Mapster.Tests/WhenMappingNullablePrimitives.cs index 6e4bb32..8d0fec3 100644 --- a/src/Mapster.Tests/WhenMappingNullablePrimitives.cs +++ b/src/Mapster.Tests/WhenMappingNullablePrimitives.cs @@ -1,6 +1,6 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Shouldly; +using System; namespace Mapster.Tests { @@ -134,8 +134,49 @@ public void Can_Map_From_Non_Nullable_Source_To_Nullable_Target() poco.IsImport.GetValueOrDefault().ShouldBeTrue(); } + /// + /// https://github.com/MapsterMapper/Mapster/issues/414 + /// + [TestMethod] + public void MappingNullTuple() + { + TypeAdapterConfig<(string?, string?, Application414), Output414>.NewConfig() + .Map(dest => dest, src => src.Item1) + .Map(dest => dest, src => src.Item2) + .Map(dest => dest.Application, src => src.Item3 == null ? (Application414)null : new Application414() + { + Id = src.Item3.Id, + Name = src.Item3.Name + }); + + (string, string, Application414) source = (null, null, null); + + var result = source.Adapt(); + + result.Item1.ShouldBeNull(); + result.Item2.ShouldBeNull(); + result.Application.ShouldBeNull(); + } + #region TestClasses + + public class Output414 + { + public string Item1 { get; set; } + + public string Item2 { get; set; } + + public Application414 Application { get; set; } + } + + public class Application414 + { + public string Name { get; set; } + + public int Id { get; set; } + } + public class NullablePrimitivesPoco { public Guid Id { get; set; } diff --git a/src/Mapster/Utils/NullableExpressionVisitor.cs b/src/Mapster/Utils/NullableExpressionVisitor.cs index ed64299..70d2516 100644 --- a/src/Mapster/Utils/NullableExpressionVisitor.cs +++ b/src/Mapster/Utils/NullableExpressionVisitor.cs @@ -127,7 +127,7 @@ protected override Expression VisitConstant(ConstantExpression node) protected override Expression VisitMember(MemberExpression node) { - CanBeNull = node.Member.GetCustomAttributesData().All(IsNullable); + CanBeNull = node.Type.IsClass || node.Member.GetCustomAttributesData().All(IsNullable); return node; } }