如何使用AutoMapper将自定义类映射为不同类型的二维数组
使用AutoMapper将MeasurementChartXY列表映射为二维数组
步骤1:配置AutoMapper映射
创建AutoMapper的映射规则,将MeasurementChartXY对象转换为包含两个元素的数组:第一个元素是DateTime转UTC后对应的1970纪元毫秒数,第二个元素是Y属性的可空数值。
var configuration = new MapperConfiguration(cfg => { cfg.CreateMap<MeasurementChartXY, object[]>() .ConvertUsing(source => new object[] { // 计算UTC时间下自1970-01-01以来的毫秒数,匹配JS getTime()逻辑 (long)(source.X.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds, source.Y // 直接映射可空double值 }); }); // 可选:验证配置是否存在错误 configuration.AssertConfigurationIsValid();
步骤2:执行映射
实例化Mapper后,即可完成列表到二维数组的转换:
var mapper = configuration.CreateMapper(); // 示例数据源 List<MeasurementChartXY> measurements = new List<MeasurementChartXY> { new MeasurementChartXY { X = DateTime.Parse("2023-07-09 10:30:54.487"), Y = 3.45 }, new MeasurementChartXY { X = DateTime.Parse("2023-07-09 10:30:54.587"), Y = 3.46 }, new MeasurementChartXY { X = DateTime.Parse("2023-07-09 10:30:54.687"), Y = 3.45 } }; // 转换为目标二维数组 object[][] result = mapper.Map<object[][]>(measurements);
关键细节说明
- 时区一致性:JS的
getTime()基于UTC时间,所以C#中必须将DateTime转为UTC后计算差值,避免时区偏移导致的数值错误。 - 可空值处理:如果
Y为null,映射后的数组对应位置会保留null;若需要默认值(比如0),可修改为source.Y ?? 0。 - 数组类型适配:如果
Y始终非空,也可以使用double[][]作为目标类型,只需将毫秒数强制转为double:(double)(...TotalMilliseconds)。
内容的提问来源于stack exchange,提问作者Evert Dausy
相关产品推荐
相关产品推荐

