@@ -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
0 commit comments