遍历表达式,找到MethodCallExpression并替换为新的Expression

Mar*_*inF 1 .net c# expression expression-trees

我有这样的表情 Expression<Func<IInterface, object>>

我如何循环/遍历表达式内的所有表达式并查找使用Func(IInterface)输入参数的任何MethodCallExpression,以调用此类方法

inputParameter => inputParameter.MyMethod(typeof(SomeClass))
Run Code Online (Sandbox Code Playgroud)

或像这样的通用扩展方法

inputParameter => inputParameter.MyMethod<SomeClass>()
Run Code Online (Sandbox Code Playgroud)

如果找到两种方法之一,则需要通过Type。对于通用扩展方法,它将是通用参数,即类型,在另一个方法调用中,它是为方法调用中的参数提供的第一个参数

这两种方法的签名如下所示

object MyMethod(Type type)
T MyMethod<T>(this IInterface param) where T : class
Run Code Online (Sandbox Code Playgroud)

然后,使用两个方法调用之一中的类型查找另一个Expression<Func<IInterface, object>>,并将该方法调用替换为表达式的“内容”。

任何可以帮助我完成此工作的人吗?

搜索表达式以查找对两个方法之一的任何调用(如果找到),获取调用中使用的类型,并查找针对该类型注册的表达式(我在词典中找到它)并将方法调用替换为表达式正在执行的操作。

这是我要完成的示例。如果我有以下两个Expression<Func<IInterface, object>>声明为Bar1和Bar2类型

Bar1: x => new Foo1(x.MyMethod(typeof(Bar2)))
Bar2: x => new Foo2()
Run Code Online (Sandbox Code Playgroud)

解决/合并Func<IInterface, object>Bar1 的for最终看起来像这样

Bar1: x => new Foo1(new Foo2())
Run Code Online (Sandbox Code Playgroud)

x.MyMethod(typeof(Bar2))类型BAR1登记在lambda通话将被替换为new Foo2()类型BAR2免费通话。

需要更多信息吗?

如果您需要更多信息来理解我的问题,请告诉我。

SLa*_*aks 5

您正在寻找ExpressionVisitor课程

您可以继承该类并重写VisitMethodCall以检查它是否正在调用您感兴趣的方法,如果是,则返回一个新的Expression,该表达式将执行其他操作以替换该方法调用。

此类是.Net 4.0的新增功能。
在.Net 3.5中,您可以从此处复制类。