@@ -39,35 +39,52 @@ public string Resolve(Field field)
39
39
return f ;
40
40
}
41
41
42
- internal string Resolve ( PropertyName property )
42
+ public string Resolve ( PropertyName property )
43
43
{
44
-
45
44
if ( property . IsConditionless ( ) ) return null ;
46
45
if ( ! property . Name . IsNullOrEmpty ( ) )
46
+ {
47
+ if ( property . Name . Contains ( "." ) )
48
+ throw new ArgumentException ( "Property names cannot contain dots." ) ;
47
49
return property . Name ;
50
+ }
48
51
string f ;
49
52
if ( this . Properties . TryGetValue ( property , out f ) )
50
53
return f ;
51
- f = this . Resolve ( property . Expression , property . Property ) ;
54
+ f = this . ResolveToLastToken ( property . Expression , property . Property ) ;
52
55
this . Properties . TryAdd ( property , f ) ;
53
56
return f ;
54
57
}
55
58
56
59
private string Resolve ( Expression expression , MemberInfo member )
57
60
{
58
61
var name = expression != null
59
- ? this . ResolveExpression ( expression )
62
+ ? this . Resolve ( expression )
60
63
: member != null
61
- ? this . ResolveMemberInfo ( member )
64
+ ? this . Resolve ( member )
62
65
: null ;
63
66
64
67
if ( name == null )
65
- throw new ArgumentException ( "Could not resolve a property name" ) ;
68
+ throw new ArgumentException ( "Could not resolve a name from the given Expression or MemberInfo. " ) ;
66
69
67
70
return name ;
68
71
}
69
72
70
- private string ResolveMemberInfo ( MemberInfo info )
73
+ private string ResolveToLastToken ( Expression expression , MemberInfo member )
74
+ {
75
+ var name = expression != null
76
+ ? this . ResolveToLastToken ( expression )
77
+ : member != null
78
+ ? this . Resolve ( member )
79
+ : null ;
80
+
81
+ if ( name == null )
82
+ throw new ArgumentException ( "Could not resolve a name from the given Expression or MemberInfo." ) ;
83
+
84
+ return name ;
85
+ }
86
+
87
+ private string Resolve ( MemberInfo info )
71
88
{
72
89
if ( info == null )
73
90
return null ;
@@ -85,7 +102,7 @@ private string ResolveMemberInfo(MemberInfo info)
85
102
return _settings . Serializer ? . CreatePropertyName ( info ) ?? _settings . DefaultFieldNameInferrer ( name ) ;
86
103
}
87
104
88
- private string ResolveExpression ( Expression expression )
105
+ private string Resolve ( Expression expression )
89
106
{
90
107
var stack = new Stack < string > ( ) ;
91
108
var properties = new Stack < ElasticsearchPropertyAttribute > ( ) ;
@@ -98,10 +115,18 @@ private string ResolveExpression(Expression expression)
98
115
. ToString ( ) ;
99
116
}
100
117
118
+ private string ResolveToLastToken ( Expression expression )
119
+ {
120
+ var stack = new Stack < string > ( ) ;
121
+ var properties = new Stack < ElasticsearchPropertyAttribute > ( ) ;
122
+ Visit ( expression , stack , properties ) ;
123
+ return stack . Last ( ) ;
124
+ }
125
+
101
126
protected override Expression VisitMemberAccess ( MemberExpression expression , Stack < string > stack , Stack < ElasticsearchPropertyAttribute > properties )
102
127
{
103
128
if ( stack == null ) return base . VisitMemberAccess ( expression , stack , properties ) ;
104
- var resolvedName = this . ResolveMemberInfo ( expression . Member ) ;
129
+ var resolvedName = this . Resolve ( expression . Member ) ;
105
130
stack . Push ( resolvedName ) ;
106
131
return base . VisitMemberAccess ( expression , stack , properties ) ;
107
132
}
0 commit comments