C# Automapper实例化目标对象,而不是递归映射

C# Automapper实例化目标对象,而不是递归映射,c#,automapper,C#,Automapper,我正在尝试将DTO对象映射到factory类中的实体对象。DTO具有所有字段值,而实体具有由名称和值组成的字段 经过一些调试,我发现Automapper实例化了每个实体字段,而不是使用现有的字段。结果,最后一次测试失败 [TestFixture] class RecursiveMappingTest { public class SourceInfo { public string Info1 = "info1"; public string In

我正在尝试将DTO对象映射到factory类中的实体对象。DTO具有所有字段值,而实体具有由名称和值组成的字段

经过一些调试,我发现Automapper实例化了每个实体字段,而不是使用现有的字段。结果,最后一次测试失败

[TestFixture]
class RecursiveMappingTest
{
    public class SourceInfo
    {
        public string Info1 = "info1";
        public string Info2 = "info1";
    }

    public class StringField
    {
        public string Name;
        public string Value;
    }

    public class DestinationInfo
    {
        public StringField Info1 = new StringField() { Name = "field name 1" };
        public StringField Info2 = new StringField() { Name = "field name 2" };
    }

    [Test]
    public void MapField()
    {
        Mapper.CreateMap<string, StringField>()
            .ForMember(dest => dest.Value, opt => opt.MapFrom(src => src));

        Mapper.CreateMap<SourceInfo, DestinationInfo>();

        SourceInfo sourceInfo = new SourceInfo();
        DestinationInfo destinationInfo = new DestinationInfo();

        Mapper.Map(sourceInfo, destinationInfo);

        // these pass
        Assert.That(destinationInfo.Info1.Value, Is.EqualTo("info1"));
        Assert.That(destinationInfo.Info2.Value, Is.EqualTo("info1"));

        // this fails since automapper instantiated brand new StringField()
        // which has Name == "".
        Assert.That(destinationInfo.Info1.Name, Is.EqualTo("field name 1"));
    }
}
[TestFixture]
类递归映射测试
{
公共类源信息
{
公共字符串Info1=“Info1”;
公共字符串Info2=“info1”;
}
公共类StringField
{
公共字符串名称;
公共字符串值;
}
公共类DestinationInfo
{
public StringField Info1=new StringField(){Name=“field Name 1”};
public StringField Info2=new StringField(){Name=“field Name 2”};
}
[测试]
公共void映射字段()
{
Mapper.CreateMap()
.ForMember(dest=>dest.Value,opt=>opt.MapFrom(src=>src));
CreateMap();
SourceInfo SourceInfo=新的SourceInfo();
DestinationInfo DestinationInfo=新的DestinationInfo();
Mapper.Map(sourceInfo,destinationInfo);
//这些通行证
Assert.That(destinationInfo.Info1.Value,Is.EqualTo(“Info1”));
Assert.That(destinationInfo.Info2.Value,Is.EqualTo(“info1”));
//由于automapper实例化了全新的StringField()
//其名称为=“”。
Assert.That(destinationInfo.Info1.Name,Is.EqualTo(“字段名1”));
}
}

这是预期的行为吗?我怎样才能实现我想要的?实体类中有大量字段,因此请尝试将第二个映射更改为:

Mapper.CreateMap<SourceInfo, DestinationInfo>()
.ForAllMembers(x => x.UseDestinationValue());
Mapper.CreateMap()
.ForAllMembers(x=>x.UseDestinationValue());

这应该为所有未映射的属性使用目标值。

尝试将第二个映射更改为:

Mapper.CreateMap<SourceInfo, DestinationInfo>()
.ForAllMembers(x => x.UseDestinationValue());
Mapper.CreateMap()
.ForAllMembers(x=>x.UseDestinationValue());

这应该为所有未映射的属性使用目标值。

Mapper.AssertConfigurationsValid()失败,但它对我有效,因为我有不同的方法检查所有属性是否映射良好。谢谢你,沃德·雷!我发现了另一个问题。奇怪的是,如果我将值更改为相同的值(就像这两个值都是
“info1”
),我会收到一个错误,显示为
System.ArgumentException:已添加具有相同密钥的项。
我更改了问题以反映问题。Mapper.AssertConfiguration验证()失败,但它对我有效,因为我有不同的方法来检查是否所有东西都映射良好。谢谢你,沃德·雷!我发现了另一个问题。奇怪,但是如果我将值更改为相同的值(就像两个值都是
“info1”
),我会收到一个错误,显示为
System.ArgumentException:已经添加了一个具有相同密钥的项。
我更改了问题以反映问题。我最终使用来解决此问题。它还解决了其他汽车制造商的挑战,我必须通过一旦这个问题得到解决。ValueInjector没有任何魔力,但一切都是透明的——或者我应该说简单的结构才是真正的魔力——而且源代码很容易掌握和学习,可以制作定制的注入代码。我会留下这个问题,因为我很想知道Automapper中的这个特殊问题。如果实体中的字段数是问题所在,您可以始终使用t4模板。我最终使用解决了这个问题。它还解决了其他汽车制造商的挑战,我必须通过一旦这个问题得到解决。ValueInjector没有任何魔力,但一切都是透明的——或者我应该说简单的结构才是真正的魔力——而且源代码很容易掌握和学习,可以制作定制的注入代码。我会留下这个问题,因为我很想知道Automapper中的这个特殊问题。如果实体中的字段数是问题所在,那么您可以始终使用t4模板。