Skip to content

Commit c954e6b

Browse files
authored
Compile lambda for null access expressions (#3157)
Fixes #3156
1 parent ef5e002 commit c954e6b

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

Diff for: src/NHibernate.Test/Criteria/Lambda/ExpressionProcessorFindValueFixture.cs

+30
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,36 @@ public void StaticPropertyInstanceMethodCall()
4242

4343
Assert.AreEqual(expected, actual);
4444
}
45+
46+
[Test]
47+
public void NullableNullHasValue()
48+
{
49+
int? v = null;
50+
var actual = GetValue(() => v.HasValue);
51+
var expected = v.HasValue;
52+
53+
Assert.AreEqual(expected, actual);
54+
}
55+
56+
[Test]
57+
public void NullableNullGetValueOrDefault()
58+
{
59+
int? v = null;
60+
var actual = GetValue(() => v.GetValueOrDefault());
61+
var expected = v.GetValueOrDefault();
62+
63+
Assert.AreEqual(expected, actual);
64+
}
65+
66+
[Test]
67+
public void NullableNullValue()
68+
{
69+
int? v = null;
70+
Expression<Func<int>> expression = () => v.Value;
71+
72+
Assert.Throws<InvalidOperationException>(() => GetValue(expression));
73+
Assert.Throws<InvalidOperationException>(() => expression.Compile().Invoke());
74+
}
4575

4676
[Test]
4777
public void StaticPropertyInstanceMultipleMethodCall()

Diff for: src/NHibernate/Impl/ExpressionProcessor.cs

+9-2
Original file line numberDiff line numberDiff line change
@@ -261,18 +261,25 @@ public static object FindValue(Expression expression)
261261
return constantExpression.Value;
262262
case ExpressionType.MemberAccess:
263263
var memberExpression = (MemberExpression) expression;
264+
var instance = findValue(memberExpression.Expression);
265+
if (instance == null && memberExpression.Expression != null)
266+
break;
267+
264268
switch (memberExpression.Member.MemberType)
265269
{
266270
case MemberTypes.Field:
267-
return ((FieldInfo) memberExpression.Member).GetValue(findValue(memberExpression.Expression));
271+
return ((FieldInfo) memberExpression.Member).GetValue(instance);
268272
case MemberTypes.Property:
269-
return ((PropertyInfo) memberExpression.Member).GetValue(findValue(memberExpression.Expression));
273+
return ((PropertyInfo) memberExpression.Member).GetValue(instance);
270274
}
271275
break;
272276
case ExpressionType.Call:
273277
var methodCallExpression = (MethodCallExpression) expression;
274278
var args = methodCallExpression.Arguments.ToArray(arg => FindValue(arg));
275279
var callingObject = findValue(methodCallExpression.Object);
280+
if (callingObject == null && methodCallExpression.Object != null)
281+
break;
282+
276283
return methodCallExpression.Method.Invoke(callingObject, args);
277284
case ExpressionType.Convert:
278285
var unaryExpression = (UnaryExpression) expression;

0 commit comments

Comments
 (0)