-
Notifications
You must be signed in to change notification settings - Fork 55
Expand file tree
/
Copy pathMapIncludesVisitor.cs
More file actions
81 lines (69 loc) · 3.33 KB
/
MapIncludesVisitor.cs
File metadata and controls
81 lines (69 loc) · 3.33 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using AutoMapper.Extensions.ExpressionMapping.Extensions;
using AutoMapper.Extensions.ExpressionMapping.Structures;
namespace AutoMapper.Extensions.ExpressionMapping
{
[Obsolete("This class is not intended for public use and may be removed in future versions.")]
public class MapIncludesVisitor : XpressionMapperVisitor
{
public MapIncludesVisitor(IMapper mapper, IConfigurationProvider configurationProvider, Dictionary<Type, Type> typeMappings)
: base(mapper, configurationProvider, typeMappings)
{
}
protected override Expression VisitLambda<T>(Expression<T> node)
{
if (!node.Body.Type.IsLiteralType())
return base.VisitLambda(node);
var ex = this.Visit(node.Body);
var mapped = Expression.Lambda(ex, node.GetDestinationParameterExpressions(this.InfoDictionary, this.TypeMappings));
this.TypeMappings.AddTypeMapping(ConfigurationProvider, node.Type, mapped.Type);
return mapped;
}
protected override Expression VisitMember(MemberExpression node)
{
if (!node.Type.IsLiteralType())
return base.VisitMember(node);
var parameterExpression = node.GetParameterExpression();
if (parameterExpression == null)
return base.VisitMember(node);
InfoDictionary.Add(parameterExpression, TypeMappings);
return GetMappedMemberExpression(node.GetBaseOfMemberExpression(), new List<PropertyMapInfo>());
Expression GetMappedMemberExpression(Expression parentExpression, List<PropertyMapInfo> propertyMapInfoList)
{
Expression mappedParentExpression = this.Visit(parentExpression);
FindDestinationFullName(parentExpression.Type, mappedParentExpression.Type, node.GetPropertyFullName(), propertyMapInfoList);
if (propertyMapInfoList.Any(x => x.CustomExpression != null))//CustomExpression takes precedence over DestinationPropertyInfo
{
return GetMemberExpression
(
new FindMemberExpressionsVisitor(mappedParentExpression),
GetMemberExpressionFromCustomExpression
(
propertyMapInfoList,
propertyMapInfoList.Last(x => x.CustomExpression != null),
mappedParentExpression
)
);
}
return GetExpressionForInclude
(
GetMemberExpressionFromMemberMaps
(
BuildFullName(propertyMapInfoList),
mappedParentExpression
)
);
}
Expression GetExpressionForInclude(MemberExpression memberExpression)
=> memberExpression.Type.IsLiteralType() ? memberExpression.Expression : memberExpression;
MemberExpression GetMemberExpression(FindMemberExpressionsVisitor visitor, Expression mappedExpression)
{
visitor.Visit(mappedExpression);
return visitor.Result;
}
}
}
}