Skip to content

Commit 1dcc20e

Browse files
ReTry to find inherited property by BindingFlags.DeclaredOnly (#581)
1 parent 3f7aaa6 commit 1dcc20e

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

net/DevExtreme.AspNet.Data.Tests/ExpressionCompilerTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ public StructWithRef(object any) {
3333
}
3434
}
3535

36+
class TargetClassEx1 : TargetClass {
37+
public int Prop { get; set; }
38+
}
39+
40+
class TargetClassEx2 : TargetClassEx1 {
41+
public new string Prop { get; set; }
42+
}
43+
3644
string CompileAccessor(bool guardNulls, string selector, Action<List<Expression>> customizeProgression = null) {
3745
return new SampleCompiler(guardNulls)
3846
.CompileAccessorExpression(Expression.Parameter(typeof(TargetClass), "t"), selector, customizeProgression)
@@ -118,6 +126,10 @@ public void Issue142() {
118126
);
119127
}
120128

129+
[Fact]
130+
public void Issue580() {
131+
Assert.Equal(typeof(String), ExpressionCompiler.GetPropertyOrField(Expression.Parameter(typeof(TargetClassEx2)), "Prop").Type);
132+
}
121133
}
122134

123135
}

net/DevExtreme.AspNet.Data/ExpressionCompiler.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)