Skip to content

Commit 43065ef

Browse files
authored
Merge pull request #512 from Altinn/ivarne/linq-to-json-path-improvement
Add a few more cases to the Linq to json path used for CreateValidationIssue
2 parents fc3442e + 76c2369 commit 43065ef

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/Altinn.App.Core/Helpers/LinqExpressionHelpers.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,31 @@ private static string GetJsonPath_internal(Expression expression)
9292
case MemberExpression { Member: FieldInfo fieldInfo, Expression: { } memberExpression }:
9393
var evaluatedMember = GetValueFromExpression(memberExpression);
9494
return fieldInfo.GetValue(evaluatedMember);
95+
// Support for evaluating the member expression on a property (recursively if needed)
96+
case MemberExpression { Member: PropertyInfo propertyInfo, Expression: { } memberExpression }:
97+
var evaluatedMember2 = GetValueFromExpression(memberExpression);
98+
return propertyInfo.GetValue(evaluatedMember2);
99+
// Support for evaluating binary expressions in indexers (eg: m=>m.Children[model.Children.Count + 1)
100+
case BinaryExpression { Left: { } leftExpr, Right: { } rightExpr } be:
101+
var left = GetValueFromExpression(leftExpr) as int? ?? throw new ArgumentException(
102+
$"Missing implementation for {be}.");
103+
var right = GetValueFromExpression(rightExpr) as int? ?? throw new ArgumentException(
104+
$"Missing implementation for {be}.");
105+
return be.NodeType switch
106+
{
107+
ExpressionType.Add => left + right,
108+
ExpressionType.Subtract => left - right,
109+
ExpressionType.Divide => left / right,
110+
ExpressionType.Multiply => left * right,
111+
ExpressionType.Modulo => left % right,
112+
_ => throw new ArgumentException(
113+
$"Missing implementation for {be}.")
114+
};
95115

96116
// Currently we just error on unknown expressions
97117
default:
98118
throw new ArgumentException(
99-
$"Invalid indexer expression {expression}. Failed reading {expression}");
119+
$"Missing implementation for {expression.GetType()} {expression}.");
100120
}
101121
}
102122

test/Altinn.App.Core.Tests/Helpers/LinqExpressionHelpersTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,37 @@ public void GetJsonPath_IndexInVariableLoop()
7676
propertyName.Should().Be($"Children[{index}].age");
7777
}
7878
}
79+
80+
[Fact]
81+
public void GetJsonPath_AritmeticExpression()
82+
{
83+
var list = new List<string>
84+
{
85+
"one",
86+
"two"
87+
};
88+
var propertyName = LinqExpressionHelpers.GetJsonPath<MyModel, int?>(m => m.Children![list.Count - 1].Age);
89+
propertyName.Should().Be("Children[1].age");
90+
}
91+
92+
[Fact]
93+
public void GetJsonPath_AritmeticExpressionOnRecursiveModel()
94+
{
95+
var model = new MyModel
96+
{
97+
Children = new()
98+
{
99+
new()
100+
{
101+
Age = 3
102+
},
103+
new()
104+
{
105+
Age = 4
106+
}
107+
}
108+
};
109+
var propertyName = LinqExpressionHelpers.GetJsonPath<MyModel, int?>(m => m.Children![model.Children.Count + 1].Age);
110+
propertyName.Should().Be("Children[3].age");
111+
}
79112
}

0 commit comments

Comments
 (0)