/
PropertyMap.cs
86 lines (85 loc) · 4.55 KB
/
PropertyMap.cs
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
namespace AutoMapper;
[DebuggerDisplay("{DestinationMember.Name}")]
[EditorBrowsable(EditorBrowsableState.Never)]
public sealed class PropertyMap : MemberMap
{
private MemberMapDetails _details;
public PropertyMap(MemberInfo destinationMember, Type destinationMemberType, TypeMap typeMap) : base(typeMap)
{
DestinationMember = destinationMember;
DestinationType = destinationMemberType;
}
public PropertyMap(PropertyMap inheritedMappedProperty, TypeMap typeMap) : base(typeMap)
{
DestinationMember = inheritedMappedProperty.DestinationMember;
if (DestinationMember.DeclaringType.ContainsGenericParameters)
{
DestinationMember = typeMap.DestinationSetters.Single(m => m.Name == DestinationMember.Name);
}
DestinationType = inheritedMappedProperty.DestinationType;
if (DestinationType.ContainsGenericParameters)
{
DestinationType = DestinationMember.GetMemberType();
}
ApplyInheritedPropertyMap(inheritedMappedProperty);
}
public PropertyMap(PropertyMap includedMemberMap, TypeMap typeMap, IncludedMember includedMember)
: this(includedMemberMap, typeMap) => Details.IncludedMember = includedMember.Chain(includedMemberMap.IncludedMember);
private MemberMapDetails Details => _details ??= new();
public MemberInfo DestinationMember { get; }
public override string DestinationName => DestinationMember?.Name;
public override Type DestinationType { get; protected set; }
public override MemberInfo[] SourceMembers { get; set; } = Array.Empty<MemberInfo>();
public override bool CanBeSet => DestinationMember.CanBeSet();
public override bool Ignored { get; set; }
public void ApplyInheritedPropertyMap(PropertyMap inheritedMap)
{
ApplyInheritedMap(inheritedMap);
if (!Ignored && inheritedMap._details != null)
{
Details.ApplyInheritedPropertyMap(inheritedMap._details);
}
}
public override IncludedMember IncludedMember => _details?.IncludedMember;
public override bool? AllowNull { get => _details?.AllowNull; set => Details.AllowNull = value; }
public int? MappingOrder { get => _details?.MappingOrder; set => Details.MappingOrder = value; }
public override bool? ExplicitExpansion { get => _details?.ExplicitExpansion; set => Details.ExplicitExpansion = value; }
public override bool? UseDestinationValue { get => _details?.UseDestinationValue; set => Details.UseDestinationValue = value; }
public override object NullSubstitute { get => _details?.NullSubstitute; set => Details.NullSubstitute = value; }
public override LambdaExpression PreCondition { get => _details?.PreCondition; set => Details.PreCondition = value; }
public override LambdaExpression Condition { get => _details?.Condition; set => Details.Condition = value; }
public void AddValueTransformation(ValueTransformerConfiguration config) => Details.AddValueTransformation(config);
public override IReadOnlyCollection<ValueTransformerConfiguration> ValueTransformers => (_details?.ValueTransformers).NullCheck();
class MemberMapDetails
{
public List<ValueTransformerConfiguration> ValueTransformers { get; private set; }
public bool? AllowNull;
public int? MappingOrder;
public bool? ExplicitExpansion;
public bool? UseDestinationValue;
public object NullSubstitute;
public LambdaExpression PreCondition;
public LambdaExpression Condition;
public IncludedMember IncludedMember;
public void ApplyInheritedPropertyMap(MemberMapDetails inheritedMappedProperty)
{
AllowNull ??= inheritedMappedProperty.AllowNull;
Condition ??= inheritedMappedProperty.Condition;
PreCondition ??= inheritedMappedProperty.PreCondition;
NullSubstitute ??= inheritedMappedProperty.NullSubstitute;
MappingOrder ??= inheritedMappedProperty.MappingOrder;
UseDestinationValue ??= inheritedMappedProperty.UseDestinationValue;
ExplicitExpansion ??= inheritedMappedProperty.ExplicitExpansion;
if (inheritedMappedProperty.ValueTransformers != null)
{
ValueTransformers ??= new();
ValueTransformers.InsertRange(0, inheritedMappedProperty.ValueTransformers);
}
}
public void AddValueTransformation(ValueTransformerConfiguration valueTransformerConfiguration)
{
ValueTransformers ??= new();
ValueTransformers.Add(valueTransformerConfiguration);
}
}
}