小编Gun*_*Gun的帖子

遍历表达式树并提取参数

我正在编写一种映射工具。我有一个看起来像这样的方法(简化):

   public void RegisterMapping<TTarget, TSource>(string propertyName, 
                                                 Expression<Func<TSource, object>> memberMap)
Run Code Online (Sandbox Code Playgroud)

是memberMap一个表达式,定义如何将属性从 转换TSource为TTarget。对于业务逻辑,我需要TSource从中提取对属性的所有引用。例如,从

x => x.Customers.Where(c => c.Orders.Any())
Run Code Online (Sandbox Code Playgroud)

我想得到Customers, 并从

x => x.FirstName + " " + x.LastName
Run Code Online (Sandbox Code Playgroud)

FirstName并且LastName(可以是 string[],PropertyInfo转换起来很简单)。

我该怎么做?我的第一种方法是手动遍历树,检查节点类型并根据节点类型检查不同的属性(例如,Operand对于一元表达式,Arguments对于函数调用)以确定其中任何一个是 的属性TSource。然后我发现了表达式种类列表,我放弃了——即使我只支持最常见的种类,这仍然是大量的工作。然后我找到了ExpressionVisitor。它看起来更好,但重写访问者方法仍然需要做很多工作,在我投入时间之前,我想知道是否还有其他选择,可能使用更专业的框架。

c# linq reflection lambda traversal

5
推荐指数
1
解决办法
2169
查看次数

标签 统计

c# ×1

lambda ×1

linq ×1

reflection ×1

traversal ×1