forked from AutoMapper/AutoMapper.Archive
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathForAllMembers.cs
More file actions
103 lines (97 loc) · 3.6 KB
/
Copy pathForAllMembers.cs
File metadata and controls
103 lines (97 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
namespace AutoMapper.UnitTests.ForAllMembers;
public class When_conditionally_applying_a_resolver_globally : AutoMapperSpecBase
{
public class Source
{
public DateTime SomeDate { get; set; }
public DateTime OtherDate { get; set; }
}
public class Dest
{
public DateTime SomeDate { get; set; }
public DateTime OtherDate { get; set; }
}
protected override MapperConfiguration CreateConfiguration() => new(cfg =>
{
cfg.ForAllPropertyMaps(pm => pm.DestinationName.StartsWith("Other"),
(pm, opt) => opt.MapFrom(typeof(ConditionalValueResolver), pm.SourceMember.Name));
cfg.CreateMap<Source, Dest>();
});
public class ConditionalValueResolver : IMemberValueResolver<object, object, DateTime, DateTime>
{
public DateTime Resolve(object s, object d, DateTime source, DateTime destination, ResolutionContext context)
{
return source.AddDays(1);
}
}
[Fact]
public void Should_use_resolver()
{
var source = new Source
{
SomeDate = new DateTime(2000, 1, 1),
OtherDate = new DateTime(2000, 1, 1),
};
var dest = Mapper.Map<Source, Dest>(source);
dest.SomeDate.ShouldBe(source.SomeDate);
dest.OtherDate.ShouldBe(source.OtherDate.AddDays(1));
}
}
public class When_conditionally_applying_a_resolver_per_profile : AutoMapperSpecBase
{
public class Source
{
public DateTime SomeDate { get; set; }
public DateTime OtherDate { get; set; }
}
public class Dest
{
public DateTime SomeDate { get; set; }
public DateTime OtherDate { get; set; }
}
class MyProfile : Profile
{
public MyProfile()
{
CreateMap<Source, Dest>();
this.Internal().ForAllPropertyMaps(pm => pm.DestinationName.StartsWith("Other"), (pm, opt) => opt.MapFrom(typeof(ConditionalValueResolver), pm.SourceMember.Name));
}
}
protected override MapperConfiguration CreateConfiguration() => new(cfg => cfg.AddProfile<MyProfile>());
public class ConditionalValueResolver : IMemberValueResolver<object, object, DateTime, DateTime>
{
public DateTime Resolve(object s, object d, DateTime source, DateTime destination, ResolutionContext context) => source.AddDays(1);
}
[Fact]
public void Should_use_resolver()
{
var source = new Source { SomeDate = new DateTime(2000, 1, 1), OtherDate = new DateTime(2000, 1, 1) };
var dest = Mapper.Map<Source, Dest>(source);
dest.SomeDate.ShouldBe(source.SomeDate);
dest.OtherDate.ShouldBe(source.OtherDate.AddDays(1));
}
}
public class ForAllPropertyMaps_ConvertUsing : AutoMapperSpecBase
{
public class Well
{
public SpecialTags SpecialTags { get; set; }
}
[Flags]
public enum SpecialTags { None, SendState, NotSendZeroWhenOpen }
public class PostPutWellViewModel
{
public SpecialTags[] SpecialTags { get; set; } = Array.Empty<SpecialTags>();
}
class EnumToArray : IValueConverter<object, object>
{
public object Convert(object sourceMember, ResolutionContext context) => new[] { SpecialTags.SendState };
}
protected override MapperConfiguration CreateConfiguration() => new(cfg =>
{
cfg.CreateMap<Well, PostPutWellViewModel>();
cfg.Internal().ForAllPropertyMaps(pm => pm.SourceType != null, (tm, mapper) => mapper.ConvertUsing(new EnumToArray()));
});
[Fact]
public void ShouldWork() => Map<PostPutWellViewModel>(new Well()).SpecialTags.Single().ShouldBe(SpecialTags.SendState);
}