C# 自动映射从内部属性到目标类
我好像想不出这个C# 自动映射从内部属性到目标类,c#,automapper,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 Inne
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;}
}
我需要从SourceClass.InnerValue直接映射到DestinationClass。我该怎么做
提前感谢。映射应如下所示:
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))
;
CreateMap()
.ForMember(x=>x.InnerPropertyId,x=>x.MapFrom(z=>z.Inner.InnerPropertyId))
.ForMember(x=>x.StrignValue,x=>x.MapFrom(z=>z.Inner.StrignValue))
;
像往常一样,在我按下“发布问题”按钮之后:
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);
Mapper.Reset();
//从,到
CreateMap();
Mapper.CreateMap()
.ConvertUsing(s=>Mapper.Map(s.Inner));
assertConfigurationsValid();
var source=new SourceClass(){Inner=new InnerValue(){InnerPropertyId=123,StringValue=“somethinges”};
var dest=Mapper.Map(源);
由于我们版本的SourceClass有一个附加值,我们希望映射到DestinationClass,因此ConvertUsing没有给出完全填充的结果,确实存在问题
我们确实发现以下代码给出了期望的结果:
{
...
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;}
}
{
...
CreateMap(MemberList.Source);
Mapper.CreateMap(MemberList.Source)
.ConstructUsing(s=>Mapper.Map(s.Inner))
.ForSourceMember(m=>m.Inner,opt=>opt.Ignore());
...
}
公共类DestinationClass
{
public int InnerPropertyId{get;set;}
公共字符串StringValue{get;set;}
公共字符串SourceClassValue{get;set;}
}
公共类SourceClass
{
公共字符串SourceClassValue{get;set;}
公共内部值内部{get;set;}
}
公共类内在价值
{
public int InnerPropertyId{get;set;}
公共字符串StrignValue{get;set;}
}
ConstructUsing在映射内部成员后继续映射其余成员,而ConvertUsing则不映射。看起来不错:)但是手动配置每个道具正是我试图避免的……这非常好,但有一个问题:配置验证失败,因为目标成员是从
Mapper.map构建的(s.Inner)
仍被报告为未显示。我已更新答案以解决您的问题。“MemberList.Source”是关键,减少了必要的忽略次数。据我所知,它忽略了目标成员验证,这在我的案例中是不允许的。我希望验证能够理解一些已通过ConstructUsing
映射的目标成员,并继续验证其余成员。我想这是不可能的ABLE asConstructUsing
会在运行时解析。因此,我现在的结论是按照您的答案进行,并添加一个配套测试。谢谢!