c# - 遍历Expression,找到MethodCallExpression并替换为新的Expression

标签 c# .net expression expression-trees

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

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

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

或者像这样的通用扩展方法

inputParameter => inputParameter.MyMethod<SomeClass>()

如果找到这两种方法之一,我需要获取传递的类型。对于通用扩展方法,它将是通用参数,即类型,在其他方法调用中,它是为方法调用中的参数提供的第一个参数

这两个方法的签名是这样的

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

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

谁能帮我解决这个问题?

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

例子

这是我正在尝试完成的示例。 如果我有以下两个 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 类型注册的调用。

需要更多信息?

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

最佳答案

您正在寻找 ExpressionVisitor class .

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

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

关于c# - 遍历Expression,找到MethodCallExpression并替换为新的Expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200783/

相关文章:

c# - 如何创建 List<T> 的新深拷贝(克隆)?

javascript - Asp.NET MVC 中的模态

c# - 使文本框透明

c# - 创建自定义异常还是使用内置异常?

php - PHP 中 preg_replace 的正则表达式

c# - 我可以使用接口(interface)或多态性将两个不同的 xml 文件反序列化为一个对象类型吗?

.net - app.config 是什么时候创建的,什么时候是 app.exe.config 和有什么区别

c# - 如何取消 HttpListenerContext.AcceptWebSocketAsync?

r - 在 R 中使用粘贴文本中的上标(对于多个值的向量)

php - Yii:查询构建器:按顺序表达