出于兼容性原因,我需要映射(最好使用 AutoMapper)一些源 POCO,它可以包含不同的可空属性,如
DateTime?
、bool?
或其他任何属性(因为在源应用程序中存在三元逻辑),但对于 DTO我需要将它们全部映射到具有相同属性集的对象,其中所有这些都只是字符串。并且 null 值需要用空字符串替换。
那么这意味着我需要这样:
来源:
TerminationDate DateTime?
...null
目的地:
TerminationDate string
...""
我需要对所有属性、所有可为空的类型执行此操作。我还没有找到任何合适的方法来配置 AutoMapper 来做到这一点,而无需一一检查所有属性(我想避免这种情况,因为名称完全匹配)。 我知道可以将全局地图设置为
CreateMap<string,string>().Convert..(....)
但它会破坏 null -> null
映射合法的所有其他映射。
我正在寻找类似的东西:
mapper.CreateMap<Source,Destination>().ForAllMembersMappingBetweenTypes<DateTime?,string>(UseTheConversion)
也许我可以使用反射来构建表达式,但这看起来有点沉重。
最简单的方法是对所有可空值进行全局操作。
cfg.CreateMap(typeof(Nullable<>), typeof(string)).ConvertUsing(s => s == null ? "" : s.ToString());
您甚至可以编写一个通用类型转换器来避免装箱。
如果您只想将其用于特定映射,则需要
ForAllMembers
为每个属性对应用转换器,可空到字符串。太乱了。你需要将其与手工进行比较,这真的是一种改进吗?