Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoMapper 2.1.265中缺少成员_C#_.net_Automapper - Fatal编程技术网

C# AutoMapper 2.1.265中缺少成员

C# AutoMapper 2.1.265中缺少成员,c#,.net,automapper,C#,.net,Automapper,在AutoMapper 2.0中,我使用配置文件来配置映射。我使用SourceMemberNameTransformer和DestinationMemberNameTransformer来匹配我的源和目标属性名 在2.1.265中,这些属性不再在配置文件中。有人知道他们为什么被移除吗?但更重要的是,如何复制此功能 编辑 我一直在查看SourceMemberNamingConvention和DestinationMemberNamingConvention,但我找不到任何关于它们如何工作的文档。是

在AutoMapper 2.0中,我使用配置文件来配置映射。我使用
SourceMemberNameTransformer
DestinationMemberNameTransformer
来匹配我的源和目标属性名

在2.1.265中,这些属性不再在配置文件中。有人知道他们为什么被移除吗?但更重要的是,如何复制此功能

编辑

我一直在查看
SourceMemberNamingConvention
DestinationMemberNamingConvention
,但我找不到任何关于它们如何工作的文档。是否有人有使用定制的公约中的
的经验

编辑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
。然后,它获取这些匹配的部分并使用
SourceMemberNamingConvention.SeparatorCharacter
调用
string.Join
。然后,它尝试将源类型成员与目标类型成员匹配

这是对is功能的一个非常高层次的概述,而不是试图描述完整的功能。它仅仅是为了显示如何使用
InMingConvention
,以及从不使用
SourceMemberNamingConvention.SplittingExpression
DestinationMemberNamingConvention.SeparatorCharacter


如果无法使用此策略转换目标成员,则必须按照建议手动映射属性。

如果删除此功能,请参阅

问题更新后编辑重写:

也许内置的
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" });
如果它没有涵盖你的所有情况,你可以检查它是如何实现的,并创建你自己的对流

编辑:评论后:

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

Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.TestWronglyNamedProp, c => c
    .MapFrom(s => s.test_wronglynamedprop));
Mapper.CreateMap()
.ForMember(d=>d.testErrorlyNamedPro,c=>c
.mapfom(s=>s.test\u错误的namedprop));

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

是的,我已经看过了。这对我没有帮助,因为我不使用前缀或后缀。你能提供一个例子来说明你想要实现什么吗?这不适用于将cmp_mastercompany映射到cmp mastercompany。这是第三方数据库省略下划线的示例。
Mapper.CreateMap<Source, Dest>()
    .ForMember(d => d.TestWronglyNamedProp, c => c
    .MapFrom(s => s.test_wronglynamedprop));