AutoMapper 2.1.265中缺少成员

cad*_*ll0 5 .net c# automapper

在AutoMapper 2.0中,我使用Profiles来配置我的映射.我使用SourceMemberNameTransformerDestinationMemberNameTransformer匹配我的源和目标属性名称.

在2.1.265中,这些属性不再出现在Profile上.有谁知道他们被删除的原因?但更重要的是,我如何复制此功能.

编辑

我一直在寻找的SourceMemberNamingConventionDestinationMemberNamingConvention,但我无法找到任何文件为如何将这些工作.有没有人有使用自定义的经验INamingConvention

编辑2

源成员是从第三方数据库生成的.通常,它们使用所有小写列名称和单词之间的下划线.有时他们会忽略下划线,有时他们会随意大写.

目标成员尝试尽可能遵循.NET命名约定.删除了下划线,下划线后面的第一个字符大写.进行了其他案例更改以使成员名称更易于阅读.

为了解决这个问题,我订了

SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper()
DestinationMemberNameTransformer = name => name.ToUpper()
Run Code Online (Sandbox Code Playgroud)

编辑3

为来自未来的人们提供更多信息.

我检查了消息来源,看看INamingConvention是如何使用的.它的设计方式有点误导.界面定义为

public interface INamingConvention
{
    Regex SplittingExpression { get; }
    string SeparatorCharacter { get; }
}
Run Code Online (Sandbox Code Playgroud)

但是,AutoMapper不会为两者SourceMemberNamingConvention和用户提供接口的完整定义DestinationMemberNamingConvention

它采用目标类型的每个成员并应用DestinationMemberNamingConvention.SplittingExpression.然后,它需要的匹配部分,并呼吁string.Join使用SourceMemberNamingConvention.SeparatorCharacter.然后,它尝试将源类型成员与目标类型成员进行匹配.

这是一个非常高级别的概述,它的作用是什么,而不是试图描述完整的功能.它仅仅是为了展示如何INamingConvention使用和显示它SourceMemberNamingConvention.SplittingExpression并且DestinationMemberNamingConvention.SeparatorCharacter从未使用过.

如果您无法使用此策略转换目标成员,则必须手动将属性映射为nemesv的答案建议.

nem*_*esv 1

看来这个功能已被删除,请参阅GitHub

编辑问题更新后重写:

也许内置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" });
Run Code Online (Sandbox Code Playgroud)

哪里SourceDest

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; }
}
Run Code Online (Sandbox Code Playgroud)

如果它没有涵盖您的所有情况,您可以检查它在源代码中的实现方式并创建您自己的约定。

编辑:评论后:

当约定不适用时,您可以回退到手动覆盖特殊情况:

Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.TestWronglyNamedProp, c => c
    .MapFrom(s => s.test_wronglynamedprop));
Run Code Online (Sandbox Code Playgroud)

我在当前版本中没有看到其他选项。因为就目前来看,没有什么可以替代MemberNameTransformers。