Mar*_*inF 1 .net c# expression expression-trees
我有这样的表情 Expression<Func<IInterface, object>>
我如何循环/遍历表达式内的所有表达式并查找使用Func(IInterface)输入参数的任何MethodCallExpression,以调用此类方法
inputParameter => inputParameter.MyMethod(typeof(SomeClass))
或像这样的通用扩展方法
inputParameter => inputParameter.MyMethod<SomeClass>()
如果找到两种方法之一,则需要通过Type。对于通用扩展方法,它将是通用参数,即类型,在另一个方法调用中,它是为方法调用中的参数提供的第一个参数
这两种方法的签名如下所示
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 的for最终看起来像这样
Bar1: x => new Foo1(new Foo2())
该x.MyMethod(typeof(Bar2))类型BAR1登记在lambda通话将被替换为new Foo2()类型BAR2免费通话。
如果您需要更多信息来理解我的问题,请告诉我。
您正在寻找ExpressionVisitor课程。
您可以继承该类并重写VisitMethodCall以检查它是否正在调用您感兴趣的方法,如果是,则返回一个新的Expression,该表达式将执行其他操作以替换该方法调用。
此类是.Net 4.0的新增功能。
在.Net 3.5中,您可以从此处复制类。