AutoMapper 2.1.265中缺少成员。

5
在AutoMapper 2.0中,我使用Profile来配置我的映射。我使用SourceMemberNameTransformerDestinationMemberNameTransformer来匹配我的源属性和目标属性名称。
在2.1.265中,这些属性不再在Profile中。有人知道为什么删除它们吗?但更重要的是,我如何复制此功能。
编辑
我一直在研究SourceMemberNamingConventionDestinationMemberNamingConvention,但我找不到任何关于它们如何工作的文档。有没有人有使用自定义INamingConvention的经验?
编辑2
源成员是从第三方数据库生成的。通常,它们使用所有小写的列名,并在单词之间使用下划线。有时它们省略下划线,有时它们随意大写。
目标成员尽可能遵循.NET命名约定。下划线被移除,下划线后的第一个字符被大写。为了使成员名称更易于阅读,进行了其他情况变化。
为了解决这个问题,我设置了
SourceMemberNameTransformer = name => name.Replace("_", "").ToUpper()
DestinationMemberNameTransformer = name => name.ToUpper()

编辑 3

为未来的读者提供更多信息。

我查看了源代码以了解 INamingConvention 的使用方式。它的设计有些误导性。这个接口被定义为:

public interface INamingConvention
{
    Regex SplittingExpression { get; }
    string SeparatorCharacter { get; }
}

然而,AutoMapper在使用SourceMemberNamingConventionDestinationMemberNamingConvention时并未使用接口的完整定义。它会获取目标类型的每个成员并应用DestinationMemberNamingConvention.SplittingExpression。然后,它获取匹配部分并调用string.Join,使用SourceMemberNamingConvention.SeparatorCharacter。接着,它尝试将源类型成员与目标类型成员进行匹配。这只是它所做的高级概述,并不试图描述其全部功能。它只是为了展示如何使用INamingConvention,以及SourceMemberNamingConvention.SplittingExpressionDestinationMemberNamingConvention.SeparatorCharacter从未被使用。如果您无法使用此策略转换目标成员,则必须像nemesv的回答建议的那样手动映射属性。
1个回答

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" });

其中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; }
}

如果它不能涵盖您的所有情况,您可以查看源代码中的实现并创建自己的约定。

编辑:在评论后:

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

Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.TestWronglyNamedProp, c => c
    .MapFrom(s => s.test_wronglynamedprop));

在当前版本中,我看不到其他选项。因为在我看来,没有任何东西能取代MemberNameTransformer

是的,我已经看过了。这对我没有帮助,因为我不使用前缀或后缀。 - cadrell0
你能提供一个例子,展示一下你试图达到什么目标吗? - nemesv
这对于将cmp_mastercompany映射到CmpMasterCompany不起作用。这是第三方数据库遗漏下划线的一个例子。 - cadrell0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接