【问题标题】:Traverse Expression, find MethodCallExpression and replace with new Expression遍历 Expression,找到 MethodCallExpression 并替换为新的 Expression
【发布时间】:2010-11-17 01:43:51
【问题描述】:

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

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

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

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

inputParameter => inputParameter.MyMethod<SomeClass>()

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

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

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

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

谁能帮我解决这个问题?

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

示例

这是我想要完成的一个例子。 如果我为 Bar1 和 Bar2 类型声明了以下两个 Expression&lt;Func&lt;IInterface, object&gt;&gt;

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

解决/组合它们,Bar1 的 Func&lt;IInterface, object&gt; 将被更改为最终看起来像这样

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

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

需要更多信息?

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

【问题讨论】:

    标签: c# .net expression expression-trees


    【解决方案1】:

    您正在寻找ExpressionVisitor class

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

    此类是 .Net 4.0 的新内容。
    在 .Net 3.5 中,您可以从 here 复制该类。

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多