Перейдите выражение, найдите метод MethodCallExpression и замените его новым выражением - PullRequest
1 голос
/ 17 ноября 2010

У меня есть такое выражение Expression<Func<IInterface, object>>

Как мне пройти / пройти по всем выражениям внутри выражения и найти любое выражение MethodCallExpression, которое использует входной параметр Func (IInterface), для вызова методавот так

inputParameter => inputParameter.MyMethod(typeof(SomeClass))

или метод общего расширения вот так

inputParameter => inputParameter.MyMethod<SomeClass>()

Если найден один из двух методов, мне нужно передать тип.Для метода Generic Extension это будет параметр Generic, который является типом, в другом вызове метода это первый аргумент, предоставленный для параметров в вызове метода

Сигнатура 2 методов выглядит следующим образом

object MyMethod(Type type)
T MyMethod<T>(this IInterface param) where T : class

Тип из одного из двух вызовов методов затем используется для поиска другого Expression<Func<IInterface, object>> и замены вызова метода «содержимым» выражения.

Любой, кто может помочьмне с, как это можно сделать?

Short

Поиск выражения для любого вызова одного из двух методов, если найден, получить тип, используемый в вызове, и поиск выражения, зарегистрированного длявведите (я получил его в словаре) и замените вызов метода тем, что делает выражение.

Пример

Вот пример того, что я пытаюсь выполнить.Если у меня есть следующие два Expression<Func<IInterface, object>>, объявленные для типа Bar1 и Bar2

Bar1: x => new Foo1(x.MyMethod(typeof(Bar2)))
Bar2: x => new Foo2()

Решая / комбинируя их, Func<IInterface, object> для Bar1 изменится, и в итоге будет выглядеть так

Bar1: x => new Foo1(new Foo2())

Звонок x.MyMethod(typeof(Bar2)) в Lambda, зарегистрированный для типа Bar1, заменяется звонком new Foo2(), зарегистрированным для типа Bar2.

Нужна дополнительная информация?

Пожалуйста, дайте мне знать, если вам нужнобольше информации, чтобы понять мой вопрос.

1 Ответ

5 голосов
/ 17 ноября 2010

Вы ищете ExpressionVisitor класс .

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

Этот класс является новым для .Net 4.0.
В .Net 3.5 вы можете скопировать класс из здесь .

...