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
.