@@ -44,7 +44,7 @@ protected internal Expression CompileAccessorExpression(Expression target, strin
4444 else if ( DynamicBindingHelper . ShouldUseDynamicBinding ( currentTarget . Type ) )
4545 currentTarget = DynamicBindingHelper . CompileGetMember ( currentTarget , clientExprItem ) ;
4646 else
47- currentTarget = FixReflectedType ( Expression . PropertyOrField ( currentTarget , clientExprItem ) ) ;
47+ currentTarget = FixReflectedType ( GetPropertyOrField ( currentTarget , clientExprItem ) ) ;
4848
4949 progression . Add ( currentTarget ) ;
5050 }
@@ -113,6 +113,23 @@ static Expression ReadExpando(Expression expando, string member) {
113113 ) ;
114114 }
115115
116+ internal static MemberExpression GetPropertyOrField ( Expression expression , string propertyOrFieldName ) {
117+ MemberExpression memberExpr ;
118+ try {
119+ memberExpr = Expression . PropertyOrField ( expression , propertyOrFieldName ) ;
120+ } catch ( AmbiguousMatchException ) {
121+ memberExpr = GetDeclaredOnlyProperty ( expression , propertyOrFieldName ) ;
122+ }
123+ return memberExpr ;
124+ }
125+
126+ static MemberExpression GetDeclaredOnlyProperty ( Expression expression , string propertyOrFieldName ) {
127+ PropertyInfo pi = expression . Type . GetProperty ( propertyOrFieldName , BindingFlags . Instance | BindingFlags . Public | BindingFlags . IgnoreCase | BindingFlags . DeclaredOnly ) ;
128+ if ( pi != null )
129+ return Expression . Property ( expression , pi ) ;
130+ throw new ArgumentException ( $ "'{ propertyOrFieldName } ' is not a member of type '{ expression . Type } '", nameof ( propertyOrFieldName ) ) ;
131+ }
132+
116133 static MemberExpression FixReflectedType ( MemberExpression expr ) {
117134 var member = expr . Member ;
118135 var declaringType = member . DeclaringType ;
0 commit comments