@@ -70,6 +70,18 @@ public override HashSet<Type> GetCustomTypes()
7070 }
7171 }
7272
73+ private class ClassWithIndexers
74+ {
75+ public int this [ int i1 ]
76+ {
77+ get => i1 + 1 ;
78+ }
79+ public string this [ int i1 , string i2 ]
80+ {
81+ get => i1 + "-" + i2 ;
82+ }
83+ }
84+
7385 private class ComplexParseLambda1Result
7486 {
7587 public int ? Age ;
@@ -660,6 +672,79 @@ public void DynamicExpressionParser_ParseLambda_Issue58()
660672 Check . That ( result ) . Equals ( 42 ) ;
661673 }
662674
675+ [ Fact ]
676+ public void DynamicExpressionParser_ParseLambda_Indexer1D ( )
677+ {
678+ // Arrange
679+ var customTypeProvider = new Mock < IDynamicLinqCustomTypeProvider > ( ) ;
680+ customTypeProvider . Setup ( c => c . GetCustomTypes ( ) ) . Returns ( [ typeof ( ClassWithIndexers ) ] ) ;
681+ var config = new ParsingConfig
682+ {
683+ CustomTypeProvider = customTypeProvider . Object
684+ } ;
685+ var expressionParams = new [ ]
686+ {
687+ Expression . Parameter ( typeof ( ClassWithIndexers ) , "myObj" )
688+ } ;
689+
690+ var myClassInstance = new ClassWithIndexers ( ) ;
691+ var invokersMerge = new List < object > { myClassInstance } ;
692+
693+ // Act
694+ var expression = DynamicExpressionParser . ParseLambda ( config , false , expressionParams , null , "myObj[3]" ) ;
695+ var del = expression . Compile ( ) ;
696+ var result = del . DynamicInvoke ( invokersMerge . ToArray ( ) ) ;
697+
698+ // Assert
699+ Check . That ( result ) . Equals ( 4 ) ;
700+ }
701+
702+ [ Fact ]
703+ public void DynamicExpressionParser_ParseLambda_Indexer2D ( )
704+ {
705+ // Arrange
706+ var customTypeProvider = new Mock < IDynamicLinqCustomTypeProvider > ( ) ;
707+ customTypeProvider . Setup ( c => c . GetCustomTypes ( ) ) . Returns ( [ typeof ( ClassWithIndexers ) ] ) ;
708+ var config = new ParsingConfig
709+ {
710+ CustomTypeProvider = customTypeProvider . Object
711+ } ;
712+ var expressionParams = new [ ]
713+ {
714+ Expression . Parameter ( typeof ( ClassWithIndexers ) , "myObj" )
715+ } ;
716+
717+ var myClassInstance = new ClassWithIndexers ( ) ;
718+ var invokersMerge = new List < object > { myClassInstance } ;
719+
720+ // Act
721+ var expression = DynamicExpressionParser . ParseLambda ( config , false , expressionParams , null , "myObj[3,\" 1\" ]" ) ;
722+ var del = expression . Compile ( ) ;
723+ var result = del . DynamicInvoke ( invokersMerge . ToArray ( ) ) ;
724+
725+ // Assert
726+ Check . That ( result ) . Equals ( "3-1" ) ;
727+ }
728+
729+ [ Fact ]
730+ public void DynamicExpressionParser_ParseLambda_IndexerParameterMismatch ( )
731+ {
732+ // Arrange
733+ var customTypeProvider = new Mock < IDynamicLinqCustomTypeProvider > ( ) ;
734+ customTypeProvider . Setup ( c => c . GetCustomTypes ( ) ) . Returns ( [ typeof ( ClassWithIndexers ) ] ) ;
735+ var config = new ParsingConfig
736+ {
737+ CustomTypeProvider = customTypeProvider . Object
738+ } ;
739+ var expressionParams = new [ ]
740+ {
741+ Expression . Parameter ( typeof ( ClassWithIndexers ) , "myObj" )
742+ } ;
743+
744+ Assert . Throws < ParseException > ( ( ) =>
745+ DynamicExpressionParser . ParseLambda ( config , false , expressionParams , null , "myObj[3,\" 1\" ,1]" ) ) ;
746+ }
747+
663748 [ Fact ]
664749 public void DynamicExpressionParser_ParseLambda_DuplicateParameterNames_ThrowsException ( )
665750 {
0 commit comments