2013-04-16 3 views
0

Мне нужно найти все вызовы для конкретного метода в дереве выражений, которые могут быть очень сложными. В настоящее время у меня есть простой рекурсивный код, который проверяет BinaryExpression, ConditionalExpression и т. Д. И, конечно же, на MethodCallExpression. Это работает, но мне интересно, есть ли более простой способ?Поиск вызова метода в дереве выражений/дереве выражений для итерации

Что мне нужно, это итератор для всего MethodCallExpression в сложном выражении, поэтому я могу просто проверить MethodCallExpression и не заботиться о других типах выражения в моем дереве. Что-то вроде этого встроено, например, где-то в System.Linq.Expressions?

+1

Покажите нам пример, который у вас есть сейчас. – Hogan

ответ

3

Как svick правильно указывает: использовать ExpressionVisitor базовый класс:

http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx

Если вы хотите, чтобы свернуть свой собственный или посмотреть, как работает ExpressionVisitor, в этой статье Мэтт Уоррен показывает вам, как восстановить дерева выражений, посетив каждый узел.

http://blogs.msdn.com/b/mattwar/archive/2007/07/31/linq-building-an-iqueryable-provider-part-ii.aspx

Вам не нужно восстановить его, вам просто нужно поиска его. Вы можете изменить код Мэтта, чтобы он не возвращал новое перестроенное выражение, он просто рекурсивно ищет каждый дочерний узел.

+2

Или просто используйте базовый класс, который уже включен в Framework: ['ExpressionVisitor'] (http://msdn.microsoft.com/en-us/library/system.linq.expressions.expressionvisitor.aspx). – svick

+0

@ svick: Хороший момент, я забыл, что мы начали включать это. –

Смежные вопросы