在AutoMapper转换中使用string.Split()处理多行日期字符串
多行日期字符串转换失败的解决方案
你的问题出在默认的DateTimeConverter只能处理单个可解析为DateTime的字符串,当输入是换行分隔的多行日期时,整个字符串无法被识别为单个DateTime对象,因此抛出解析错误。要实现每行日期单独转换的需求,需要自定义类型转换器来处理多行场景。
实现步骤
自定义多行日期转换器
编写一个继承ITypeConverter<string, string>的转换器,将输入字符串按行分割,逐个解析并转换每个日期,最后拼接回原格式:using AutoMapper; using System.Globalization; using System.Collections.Generic; public class MultiLineDateTimeConverter : ITypeConverter<string, string> { // 输入日期格式 private const string InputDateFormat = "yyyy-MM-ddTHH:mm:ss"; // 输出日期格式 private const string OutputDateFormat = "yyyy-MM-ddTHH:mm:ssz"; public string Convert(string source, string destination, ResolutionContext context) { if (string.IsNullOrWhiteSpace(source)) return source; // 按换行符分割,保留所有行(包括空行) var lines = source.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None); var convertedLines = new List<string>(); foreach (var line in lines) { // 尝试解析当前行的日期 if (DateTime.TryParseExact(line.Trim(), InputDateFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedDate)) { // 转换为目标格式 convertedLines.Add(parsedDate.ToString(OutputDateFormat, CultureInfo.InvariantCulture)); } else { // 解析失败时保留原行内容,避免报错 convertedLines.Add(line); } } // 用原换行符拼接结果,保持格式一致 return string.Join("\r\n", convertedLines); } }替换原转换器配置
在B类的映射配置中,使用自定义转换器替代原来的DateTimeConverter:class B : A { public B() { Map(m => m.dates) .TypeConverter<MultiLineDateTimeConverter>(); } }
说明
- 自定义转换器会逐行处理输入字符串,确保每个有效日期都被转换为目标格式,无效行(或空行)会原样保留,避免解析报错。
- 如果你的换行符格式不是
\r\n(比如仅\n),可以调整Split方法的参数适配实际场景。
内容的提问来源于stack exchange,提问作者Imran Ahmad Shahid
相关产品推荐
相关产品推荐

