4

我正在编写评估 .NETExpression树的代码。我正在尝试创建一个 C# 4 测试来练习我对 的处理ExpressionType.Index,但我不知道如何通过LambdaExpression. 无论我尝试什么,表达式都会以ExpressionType.Callor形式出现ExpressionType.ArrayIndex。例如:

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

什么是IndexExpression, 可以通过LambdaExpressionC# 4 中的内联创建吗?

4

1 回答 1

5

AnIndexExpression正是您所期望的(即,数组访问或索引器属性)。它是从 DLR 移植过来的众多新表达式类型之一。然而,C# 4.0 编译器使用与其先前版本相同的表达式类型,因此它不会IndexExpression在任何地方使用。如果他们的设计者愿意,其他语言也可以这样做。

IndexExpression要以编程方式创建,请使用类上的 static ArrayAccess()MakeIndex()Property()方法Expression

于 2010-07-27T04:13:14.640 回答