Comment créer une expression .NET avec NodeType of ExpressionType.Index?

J’écris du code qui évalue les arbres d’ Expression .NET. J’essaie de créer un test C # 4 pour gérer le traitement d’un ExpressionType.Index , mais je ne vois pas comment créer ce type d’expression via un LambdaExpression . Peu importe ce que j’essaie, l’expression apparaît sous la forme ExpressionType.Call ou ExpressionType.ArrayIndex . Par exemple:

 IList myList = new ObservableCollection { 3, 56, 8 }; Expression<Func> myExpression = () => myList[3]; // myExpression.Body.NodeType == ExpressionType.Call myList = new int[] { 3, 56, 8 }; myExpression = () => myList[3]; // myExpression.Body.NodeType == ExpressionType.Call int[] myArray = new int[] { 3, 56, 8 }; myExpression = () => myArray[3]; // myExpression.Body.NodeType == ExpressionType.ArrayIndex List myNonInterfaceList = new List { 3, 7, 4, 2 }; myExpression = () => myNonInterfaceList[3]; // myExpression.Body.NodeType == ExpressionType.Call 

Qu’est-ce qu’une IndexExpression et peut-on en créer une via une LambdaExpression en ligne en C # 4?

Un IndexExpression correspond exactement à ce que vous attendez (c’est-à-dire un access à un tableau ou une propriété d’indexeur). C’est l’un des nombreux nouveaux types d’expression transférés du DLR. Cependant, le compilateur C # 4.0 utilise les mêmes types d’expression que sa version précédente, de sorte qu’il n’utilisera IndexExpression nulle part. D’autres langues peuvent le faire si leurs concepteurs le souhaitent.

Pour créer une IndexExpression programme, utilisez les ArrayAccess() static ArrayAccess() , MakeIndex() ou Property() sur la classe Expression .