-
Notifications
You must be signed in to change notification settings - Fork 329
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #545 from stormaref/master
Fix Issues #536 -> Set properties with reflection if destination has init only properties.
- Loading branch information
Showing
10 changed files
with
243 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"version": 1, | ||
"isRoot": true, | ||
"tools": { | ||
"mapster.tool": { | ||
"version": "8.3.0", | ||
"commands": [ | ||
"dotnet-mapster" | ||
] | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
using System.Linq.Expressions; | ||
|
||
namespace Mapster.Tool.Tests.Mappers; | ||
|
||
[Mapper] | ||
public interface IUserMapper | ||
{ | ||
Expression<Func<_User, _UserDto>> UserProjection { get; } | ||
_UserDto MapTo(_User user); | ||
_UserDto MapTo(_User user, _UserDto userDto); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
using System; | ||
using System.Linq.Expressions; | ||
using Mapster.Tool.Tests; | ||
using Mapster.Tool.Tests.Mappers; | ||
|
||
namespace Mapster.Tool.Tests.Mappers | ||
{ | ||
public partial class UserMapper : IUserMapper | ||
{ | ||
public Expression<Func<_User, _UserDto>> UserProjection => p1 => new _UserDto() | ||
{ | ||
Id = p1.Id, | ||
Name = p1.Name | ||
}; | ||
public _UserDto MapTo(_User p2) | ||
{ | ||
return p2 == null ? null : new _UserDto() | ||
{ | ||
Id = p2.Id, | ||
Name = p2.Name | ||
}; | ||
} | ||
public _UserDto MapTo(_User p3, _UserDto p4) | ||
{ | ||
if (p3 == null) | ||
{ | ||
return null; | ||
} | ||
_UserDto result = p4 ?? new _UserDto(); | ||
|
||
typeof(_UserDto).GetProperty("Id").SetValue(result, (object)p3.Id); | ||
typeof(_UserDto).GetProperty("Name").SetValue(result, p3.Name); | ||
return result; | ||
|
||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<TargetFramework>net6.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
|
||
<IsPackable>false</IsPackable> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="FluentAssertions" Version="6.9.0" /> | ||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" /> | ||
<PackageReference Include="Scrutor" Version="4.2.1" /> | ||
<PackageReference Include="xunit" Version="2.4.2" /> | ||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> | ||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||
<PrivateAssets>all</PrivateAssets> | ||
</PackageReference> | ||
<PackageReference Include="coverlet.collector" Version="3.1.2"> | ||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||
<PrivateAssets>all</PrivateAssets> | ||
</PackageReference> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<Generated Include="**\*.g.cs" /> | ||
<Generated Remove="obj\**" /> | ||
</ItemGroup> | ||
<Target Name="CleanGenerated"> | ||
<Delete Files="@(Generated)" /> | ||
</Target> | ||
<Target Name="Mapster"> | ||
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet build" /> | ||
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet tool restore" /> | ||
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster model -a $(TargetDir)$(ProjectName).dll -n Sample.CodeGen.Models -o Models -r" /> | ||
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster extension -a $(TargetDir)$(ProjectName).dll -n Sample.CodeGen.Models -o Models" /> | ||
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster mapper -a $(TargetDir)$(ProjectName).dll -n Sample.CodeGen.Mappers -o Mappers" /> | ||
</Target> | ||
<ItemGroup> | ||
<Compile Remove="obj\**" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<EmbeddedResource Remove="obj\**" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<None Remove="obj\**" /> | ||
</ItemGroup> | ||
<ItemGroup> | ||
<ProjectReference Include="..\Mapster.Tool\Mapster.Tool.csproj" /> | ||
</ItemGroup> | ||
|
||
</Project> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
using Microsoft.Extensions.DependencyInjection; | ||
|
||
namespace Mapster.Tool.Tests; | ||
|
||
public class TestBase | ||
{ | ||
private readonly IServiceScopeFactory _scopeFactory; | ||
|
||
public TestBase() | ||
{ | ||
var services = ConfigureServiceCollection(); | ||
using var scope = services.BuildServiceProvider().CreateScope(); | ||
_scopeFactory = scope.ServiceProvider.GetRequiredService<IServiceScopeFactory>(); | ||
} | ||
|
||
private ServiceCollection ConfigureServiceCollection() | ||
{ | ||
ServiceCollection services = new(); | ||
services.Scan(selector => selector | ||
.FromCallingAssembly() | ||
.AddClasses() | ||
.AsMatchingInterface() | ||
.WithSingletonLifetime()); | ||
return services; | ||
} | ||
|
||
protected TInterface GetMappingInterface<TInterface>() | ||
{ | ||
using var scope = _scopeFactory.CreateScope(); | ||
var service = scope.ServiceProvider.GetService(typeof(TInterface)); | ||
if (service == null) | ||
{ | ||
throw new Exception($"Service of type {typeof(TInterface).Name} not found!"); | ||
} | ||
|
||
return (TInterface)service; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
global using Xunit; |
47 changes: 47 additions & 0 deletions
47
src/Mapster.Tool.Tests/WhenMappingWithExistingObjectAndInitProperties.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
using System.Reflection; | ||
using FluentAssertions; | ||
using Mapster.Tool.Tests.Mappers; | ||
|
||
namespace Mapster.Tool.Tests; | ||
|
||
/// <summary> | ||
/// Tests for https:/MapsterMapper/Mapster/issues/536 | ||
/// </summary> | ||
public class WhenMappingWithExistingObjectAndInitProperties : TestBase | ||
{ | ||
[Fact] | ||
public void MapWithReflection() | ||
{ | ||
TypeAdapterConfig.GlobalSettings | ||
.Scan(Assembly.GetExecutingAssembly()); | ||
|
||
var userMapper = GetMappingInterface<IUserMapper>(); | ||
var expected = "Aref"; | ||
var user = new _User { Name = expected, Id = 1 }; | ||
var dto = new _UserDto(); | ||
userMapper.MapTo(user, dto); | ||
dto.Name.Should().Be(expected); | ||
} | ||
} | ||
|
||
public class UserMappingRegister : IRegister | ||
{ | ||
public void Register(TypeAdapterConfig config) | ||
{ | ||
config.NewConfig<_User, _UserDto>() | ||
.MapToConstructor(true) | ||
.ConstructUsing(s => new _UserDto()); | ||
} | ||
} | ||
|
||
public class _User | ||
{ | ||
public int Id { get; init; } | ||
public string Name { get; init; } | ||
} | ||
|
||
public class _UserDto | ||
{ | ||
public int Id { get; init; } | ||
public string Name { get; init; } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters