在AutoMapper 2.0中,我使用Profiles配置我的映射。我使用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's answer建议。
答案 0 :(得分:1)
此接缝此功能已删除,请参阅GitHub。
EDIT在问题更新后重写:
也许内置的LowerUnderscoreNamingConvention
可以解决您的问题。
我已经使用此代码进行了测试:
Mapper.Initialize(c =>
c.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention());
Mapper.CreateMap<Source, Dest>();
var test = Mapper.Map<Dest>(
new Source() { test_Another_Prop = "test", test_this_prop = "test" });
Source
和Dest
:
public class Source
{
public string test_this_prop { get; set; }
public string test_Another_Prop { get; set; }
public string test_wronglynamedprop { get; set; }
}
public class Dest
{
public string TestThisProp { get; set; }
public string TestAnotherProp { get; set; }
public string TestWronglyNamedProp { get; set; }
}
如果它没有涵盖您的所有情况,您可以检查它的实施方式in the source并创建您自己的对话。
编辑:评论后:
当约定不适用时,您可以回退以手动覆盖特殊情况:
Mapper.CreateMap<Source, Dest>()
.ForMember(d => d.TestWronglyNamedProp, c => c
.MapFrom(s => s.test_wronglynamedprop));
我在当前版本中看不到其他选项。因为只要看不到任何内容就会替换MemberNameTransformer
s。