Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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# 自动映射从内部属性到目标类_C#_Automapper - Fatal编程技术网

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 as
ConstructUsing
会在运行时解析。因此,我现在的结论是按照您的答案进行,并添加一个配套测试。谢谢!