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

时间:2010-11-17 01:43:52

标签: c# .net expression expression-trees

我有一个像Expression<Func<IInterface, object>>

这样的表达式

如何遍历/遍历表达式中的所有表达式,并找到使用Func(IInterface)的输入参数的任何MethodCallExpression,以调用这样的方法

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

或像这样的通用扩展方法

inputParameter => inputParameter.MyMethod<SomeClass>()

如果找到两种方法中的一种,我需要传递Type。对于Generic Extension方法,它将是Generic参数,它是Type,在另一个方法调用中,它是为方法调用中的参数提供的第一个参数

2种方法的签名看起来像这样

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

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

有谁可以帮我解决这个问题?

在Expression中搜索对两种方法之一的任何调用,如果找到,获取调用中使用的类型,并查找为该类型注册的表达式(我在字典中得到它)并将方法调用替换为表达式正在做。

实施例

这是我想要完成的一个例子。 如果我为类型Bar1和Bar2

声明了以下两个Expression<Func<IInterface, object>>
Bar1: x => new Foo1(x.MyMethod(typeof(Bar2)))
Bar2: x => new Foo2()

解决/合并它们Bar1的Func<IInterface, object>将更改为最终看起来像这样

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

为Bar1类型注册的Lambda中的x.MyMethod(typeof(Bar2))调用将替换为为Bar2类型注册的new Foo2()调用。

需要更多信息?

如果您需要更多信息来了解我的问题,请与我们联系。

1 个答案:

答案 0 :(得分:5)

您正在寻找ExpressionVisitor class

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

这个类是.Net 4.0的新增功能 在.Net 3.5中,您可以从here复制课程。