Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从字符串创建属性(集合)表达式选择器?_C#_Linq_Lambda_Expression Trees_Dynamic Linq - Fatal编程技术网

C# 如何从字符串创建属性(集合)表达式选择器?

C# 如何从字符串创建属性(集合)表达式选择器?,c#,linq,lambda,expression-trees,dynamic-linq,C#,Linq,Lambda,Expression Trees,Dynamic Linq,我想转换linq表达式中的字符串“Employee.Orders.OrderID:“Employee.Orders.Select(order=>order.OrderID)” 我已经知道如何在简单属性(如“Employee.FirstName”)中执行此操作。我的问题是如何在集合中的类型内的属性中执行此操作 “订单”是“Employee”类中订单的集合。 “OrderID”是类“Order”的属性 换句话说,我想改变这个 string path = "Employee.Orders.OrderI

我想转换linq表达式中的字符串“Employee.Orders.OrderID:“Employee.Orders.Select(order=>order.OrderID)

我已经知道如何在简单属性(如“Employee.FirstName”)中执行此操作。我的问题是如何在集合中的类型内的属性中执行此操作

“订单”是“Employee”类中订单的集合。 “OrderID”是类“Order”的属性

换句话说,我想改变这个

string path = "Employee.Orders.OrderID";
进入这一领域

Expression<Func<Employee, object>> exp = employee => employee.Orders.Select(order => order.OrderID);
exp=employee=>employee.Orders.Select(order=>order.OrderID);
这应该可以做到:

我还没有编译结果表达式,但它毫无例外地构建了表达式

编辑:我添加了一行代码来创建lambda并对其进行编译,确实如此,因此它可以正常工作

它可以处理您访问集合的属性的场景,该集合的属性是Orders.OrderID,这使得它有点复杂。如果没有它,它将缩短大约30行

目前,它所做的是拆分“.”上的字符串,然后递归处理每个元素。如果元素是
IEnumerable
(但不是字符串),它将构建一个额外的
Select
lambda


它还处理了一个稍微复杂一些(但基本相同)的场景,您可以在集合属性中访问集合属性。

我还没有时间进行测试,但非常好,谢谢。几个小时后我会做一些测试,如果可以的话我会回来确认你的答案。所以我回来感谢你的帮助,你的答案非常有效。你帮助一个开源项目变得更好,如果你或任何人想知道更多关于这个项目的信息,请看这里:很高兴我能帮忙:)祝你在这个项目上好运!我有一个类似的ish项目(更类似于Automapper,而不是你的库),它用表达式做很多事情,因此我知道这一点。