在AutoMapper 2.0中,我使用Profile来配置我的映射。我使用
在2.1.265中,这些属性不再在Profile中。有人知道为什么删除它们吗?但更重要的是,我如何复制此功能。
编辑
我一直在研究
编辑2
源成员是从第三方数据库生成的。通常,它们使用所有小写的列名,并在单词之间使用下划线。有时它们省略下划线,有时它们随意大写。
目标成员尽可能遵循.NET命名约定。下划线被移除,下划线后的第一个字符被大写。为了使成员名称更易于阅读,进行了其他情况变化。
为了解决这个问题,我设置了
然而,AutoMapper在使用
SourceMemberNameTransformer
和DestinationMemberNameTransformer
来匹配我的源属性和目标属性名称。在2.1.265中,这些属性不再在Profile中。有人知道为什么删除它们吗?但更重要的是,我如何复制此功能。
编辑
我一直在研究
SourceMemberNamingConvention
和DestinationMemberNamingConvention
,但我找不到任何关于它们如何工作的文档。有没有人有使用自定义INamingConvention
的经验?编辑2
源成员是从第三方数据库生成的。通常,它们使用所有小写的列名,并在单词之间使用下划线。有时它们省略下划线,有时它们随意大写。
目标成员尽可能遵循.NET命名约定。下划线被移除,下划线后的第一个字符被大写。为了使成员名称更易于阅读,进行了其他情况变化。
为了解决这个问题,我设置了
SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper()
DestinationMemberNameTransformer = name => name.ToUpper()
编辑 3
为未来的读者提供更多信息。
我查看了源代码以了解 INamingConvention
的使用方式。它的设计有些误导性。这个接口被定义为:
public interface INamingConvention
{
Regex SplittingExpression { get; }
string SeparatorCharacter { get; }
}
然而,AutoMapper在使用
SourceMemberNamingConvention
和DestinationMemberNamingConvention
时并未使用接口的完整定义。它会获取目标类型的每个成员并应用DestinationMemberNamingConvention.SplittingExpression
。然后,它获取匹配部分并调用string.Join
,使用SourceMemberNamingConvention.SeparatorCharacter
。接着,它尝试将源类型成员与目标类型成员进行匹配。这只是它所做的高级概述,并不试图描述其全部功能。它只是为了展示如何使用INamingConvention
,以及SourceMemberNamingConvention.SplittingExpression
和DestinationMemberNamingConvention.SeparatorCharacter
从未被使用。如果您无法使用此策略转换目标成员,则必须像nemesv的回答建议的那样手动映射属性。