Как создать .NET Expression с NodeType ExpressionType.Index? - PullRequest
3 голосов
/ 27 июля 2010

Я пишу код, который оценивает деревья .NET Expression.Я пытаюсь создать тест C # 4, чтобы проверить мою обработку ExpressionType.Index, но я не могу понять, как создать этот тип выражения через LambdaExpression.Независимо от того, что я пытаюсь, выражение выглядит как ExpressionType.Call или 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, и можно ли его создать с помощью встроенного LambdaExpression в C # 4?

1 Ответ

4 голосов
/ 27 июля 2010

IndexExpression - это именно то, что вы ожидаете (то есть, доступ к массиву или свойство индексатора). Это один из многих новых типов выражений, перенесенных из DLR. Однако компилятор C # 4.0 использует те же типы выражений, что и его предыдущая версия, поэтому он нигде не будет использовать IndexExpression. Другие языки могут делать это, если их дизайнеры желают этого.

Чтобы создать IndexExpression программно, используйте статические методы ArrayAccess(), MakeIndex() или Property() в классе Expression.

...