c# - 动态 Lambda 表达式 - 选择子属性
问题描述
我正在尝试生成一个 Lambda 表达式来选择一个日期属性和一个值属性来在客户端生成一个图表。
我想出了以下代码 - 可以很好地选择Value Property
void Main()
{
// key to be selected by end user - to view values of it by datetime
var inputKey = nameof(VehicleSensorLog.iTemperatureSensor1);
// always need datetime for graph
var dateKey = nameof(VehicleSensorLog.VehicleMonitoringLog.dtUTCDateTime);
Type gType = typeof(GraphDTO);
Type inputType = typeof(VehicleSensorLog);
ParameterExpression xParam = Expression.Parameter(inputType, "g");
// new statement "new GraphDTO()"
var xNew = Expression.New(gType);
// select properties
var xPropValue = gType.GetProperty(nameof(GraphDTO.Value));
var xSourceValue = Expression.Property(xParam, inputType.GetProperty(inputKey));
var xPropDateTime = gType.GetProperty(nameof(GraphDTO.LogDateTime));
// HOW TO DO THIS?
// -----------------
var xSourcePropDateTime = Expression.PropertyOrField(xParam, "VehicleMonitoringLog.dtUTCDateTime");
// Bind / Map from Origional to New GraphDTO property (set value "Field1 = o.Field1")
var xBindExpression = Expression.Bind(xPropValue, xSourceValue);
var xBindExpressionDateTime = Expression.Bind(xPropDateTime, xSourceValue);
// initialization "new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var xInit = Expression.MemberInit(xNew, new List<MemberAssignment>() { xBindExpression, xBindExpressionDateTime });
// expression "o => new Data { Field1 = o.Field1, Field2 = o.Field2 }"
var lambda = Expression.Lambda<Func<VehicleSensorLog, GraphDTO>>(xInit, xParam);
// finally select the logs based on lambda created
this.VehicleSensorLogs.Select(lambda).Take(10).Dump();
}
public class GraphDTO
{
public DateTime LogDateTime { get; set; }
public Double? Value { get; set; }
}
我无法从源中选择 DateTime 属性,因为它是导航(子)属性。我试过以下两种:
var xSourcePropDateTime = Expression.PropertyOrField(xParam, "VehicleMonitoringLog.dtUTCDateTime");
var xSourcePropDateTime = Expression.Property(xParam, inputType.GetProperty("VehicleMonitoringLog.dtUTCDateTime"));
如何为子属性创建表达式?
解决方案
PropertyOrField 方法不支持访问嵌套属性的点表示法,因此您需要像这样连续获取属性:
var logItem = Expression.PropertyOrField(xParam, "VehicleMonitoringLog");
var xSourcePropDateTime = Expression.PropertyOrField(logItem,"dtUTCDateTime");
推荐阅读
- qt - QML 中的 QMessageBox::aboutQt 等价物是什么?
- excel - 我正在尝试查找给定范围之间的所有数字
- c# - 一个asp:UpdatePanel正在停止下载弹窗弹出
- c++ - 如何在c ++中将函数作为参数传递给它自己的参数
- reactjs - 用于返回 React.Fragment 的函数的单元酶测试,该函数从供应商日期选择器中调用
- .net - 如何强制 nuget 使用特定版本的 MSBuild
- vue.js - 将 tailwind.css 文件保存在 src 之外会破坏 css Vue
- c# - UnityEngine.SceneManagement 程序集参考消失了
- javascript - 如何使用 put 请求更改我的数组
- php - '..' 和 '.' 在 php 中的含义与在 Linux 中的含义相同