从内部属性到目标类的自动映射映射

b0r*_*0rg 7 c# automapper

不能'似乎想出这个.

public class DestinationClass
{
    public int InnerPropertyId { get; set; }
    public string StrignValue { get; set; }
}

public class SourceClass
{
    public InnerValue Inner { get; set; }
}

public class InnerValue
{
    public int InnerPropertyId { get; set; }
    public string StrignValue {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我需要从SourceClass.InnerValue直接映射到DestinationClass.我怎么做?

提前致谢.

b0r*_*0rg 10

像往常一样,在我点击帖子问题按钮后:

Mapper.Reset();
// from, to
Mapper.CreateMap<InnerValue, DestinationClass>();
Mapper.CreateMap<SourceClass, DestinationClass>()
    .ConvertUsing(s => Mapper.Map<InnerValue, DestinationClass>(s.Inner));

Mapper.AssertConfigurationIsValid();

var source = new SourceClass() { Inner = new InnerValue() { InnerPropertyId = 123, StringValue = "somethinges" } };

var dest = Mapper.Map<SourceClass, DestinationClass>(source);
Run Code Online (Sandbox Code Playgroud)


Pau*_*ich 6

我们确实遇到了ConvertUsing没有给出完全填充结果的问题,因为我们的SourceClass版本有一个我们想要映射到DestinationClass的附加值

我们确实发现以下代码给出了所需的结果:

{
    ...
    Mapper.CreateMap<InnerValue, DestinationClass>(MemberList.Source);
    Mapper.CreateMap<SourceClass, DestinationClass>(MemberList.Source)
          .ConstructUsing(s => Mapper.Map<DestinationClass>(s.Inner))
          .ForSourceMember(m => m.Inner, opt => opt.Ignore());
    ...
}

public class DestinationClass
{
    public int InnerPropertyId { get; set; }
    public string StringValue { get; set; }
    public string SourceClassValue { get; set; }
}

public class SourceClass
{
    public string SourceClassValue { get; set; }
    public InnerValue Inner { get; set; }
}

public class InnerValue
{
    public int InnerPropertyId { get; set; }
    public string StrignValue {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

ConstructUsing在映射内部成员后继续映射其余成员,而ConvertUsing不映射.


Dim*_*ima 5

映射应如下所示:

CreateMap<SourceClass, DestinationClass>()
    .ForMember(x => x.InnerPropertyId , x => x.MapFrom(z => z.Inner.InnerPropertyId))
    .ForMember(x => x.StrignValue , x => x.MapFrom(z => z.Inner.StrignValue))
;
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错 :) 但是手动配置每个道具正是我试图避免的...... (2认同)

maz*_*nko 5

另一种方法可能是利用扁平化功能。

Mapper.CreateMap<SourceClass, DestinationClass>()
    .IncludeMembers(s => s.Inner);
Run Code Online (Sandbox Code Playgroud)

然后,Automapper 将使用InnerValueSourceClass 本身中的成员