自动映射嵌套对象

Dme*_*hro 4 c# automapping asp.net-web-api .net-core

我有以下类结构

public class ClassA
{
    public ClassB objB;
}

Public class ClassB
{
    public ListOfData objListofData;
}

public class ListOfData 
{
    public Employee objEmp;
}

public class Employee
{
    public string FirstName;
    public string LastName;
}
Run Code Online (Sandbox Code Playgroud)

上面层次结构的返回类型是

"ClassA":{
    "classB":{
        "ListOfData":{
            "employee":{
                "FirstName":"David",
                "LastName" :"Peter"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想将employee类映射到EmployeeViewModel,其中Employee firstname和lastname将映射到employeeViewModel FullName属性.我可以通过遵循一段代码来实现这一点

public class EmployeeViewModel
{
    public FullName;
}


CreateMap<Employee,EmployeeViewModel>()
                         .ForMember(dest => dest.FullName,
                                    opts => opts.MapFrom(
                                        src => string.Format("{0} {1}",
                                        src.FirstName, src.LastName)));
Run Code Online (Sandbox Code Playgroud)

现在我如何返回原始classA对象,它具有EmployeeViewModel的映射.这样的事情?

"ClassA":{
    "classB":{
        "ListOfData":{
            "EmployeeViewModel":{
                "FullName":"David Peter"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dme*_*hro 6

花了很多时间阅读文档后,我发现这里的解决方案是我的方法

a)像这样创建类源和目标类

public class ClassA
{
    public ClassB objB;
}

Public class ClassB
{
    public ListOfData objListofData;
}

public class ListOfData 
{
    public Employee objEmp;
}

public class Employee
{
    public string FirstName;
    public string LastName;
}
------------------------------------
public class DestClassA
{
    public DestClassB objB;
}

Public class DestClassB
{
    public DestListOfData objListofData;
}

public class DestListOfData 
{
    public DestEmployee objEmp;
}

public class EmployeeViewModel
{
    public string FullName;
}
Run Code Online (Sandbox Code Playgroud)

b)创建映射

var config = new MapperConfiguration(cfg => {

    cfg.CreateMap<Employee, EmployeeViewModel>().
                ForMember(dest => dest.FullName, opts => opts.MapFrom(
                    src => string.Format("{0} - {1}",
                    src.FirstName, src.LastName)));
    cfg.CreateMap<ListOfData, DestListOfData>();
    cfg.CreateMap<GetFundFamilyOutOfBalanceTotalsResponse, GetFundFamilyOutOfBalanceTotalsResponseMapped>();
    cfg.CreateMap<ClassB, DestClassB>();
    cfg.CreateMap<ClassA, DestClassA>();
});
Run Code Online (Sandbox Code Playgroud)

//这是为了确保您的映射是正确的

config.AssertConfigurationIsValid();
Run Code Online (Sandbox Code Playgroud)

//您可以测试自动对象是否创建了预期的对象,在映射后添加以下代码

var mapper = config.CreateMapper();
var output = new ClassA
{
    objClassB = new ClassB
    {
        objListofData = new ListOfData 
        {
            Employee = new []
               {
                    new Employee  { FirstName = "David", LastName ="Peter" }
               }
        }
    }
};

var destMap = mapper.Map<DestClassA>(output);
Run Code Online (Sandbox Code Playgroud)

//如果你探索这个对象,你会发现像这样的对象结构

"ClassA":{
    "classB":{
        "ListOfData":{
            "EmployeeViewModel":{
                "FullName":"David Peter"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)