2013-10-20 344 views
2

我有一个名为ActionResult的实体,我的方法沿着应用程序返回。现在,我想它是在该对象的数组正确的位置映射在一个的ActionResult返回的对象......AutoMapper映射对象到数组

public class Core 
{ 
    public Employee[] Employees = new[] { 
     new Employee { 
      Name = "Jack", 
      Age = 21, 
      Salary = 1000 
     }, 
     new Employee { 
      Name = "Carl", 
      Age = 35, 
      Salary = 1000 
     }, 
     new Employee { 
      Name = "Tom", 
      Age = 41, 
      Salary = 1000 
     }, 
    }; 
} 

public class ActionResult 
{ 
    public string ActionID { get; set; } 
    public Employee Employee { get; set; } 
} 

public class Employee 
{ 
    public String Name { get; set; } 
    public int? Age { get; set; } 
    public int? Salary { get; set; } 
    public int? Level { get; set; } 
} 

public ActionResult MethodThatReturnsActionResultWithAnEmployee() 
{ 
    return new ActionResult { 
     ActionID = new Guid().ToString(), 
     Employee = new Employee { 
      Name = "Carl", 
      Age = 35, 
      Salary = 7000, 
      Level = 1 
     } 
    }; 
} 

现在,你可以看到我想要做的是采取的是从返回的员工方法,并搜索Core中的Employees数组,并使用AutoMapper使用新的给定数据对其进行更新。

回答

2

AutoMapper不会搜索某些数组中的员工给你。如何知道哪些员工应该被视为平等?您应该手动搜索的员工,并使用相应的映射方法与其他员工的实例数据来更新员工的现有实例:

Mapper.CreateMap<Employee, Employee>(); 
var result = MethodThatReturnsActionResultWithAnEmployee(); 
var employee = result.Employee; 
var core = new Core(); 
var employeeToUpdate = 
    core.Employees.FirstOrDefault(e => e.Name == employee.Name); 
Mapper.Map(employee, employeeToUpdate); 

如果你真的想映射看起来像

Mapper.Map(result, core); 

那么你应该写下你自己的类型映射器:

public class ActionResultToCoreConverter : ITypeConverter<ActionResult, Core> 
{ 
    public Core Convert(ResolutionContext context) 
    { 
     var result = (ActionResult)context.SourceValue; 
     var employee = result.Employee; 
     var core = (Core)context.DestinationValue ?? new Core(); 
     var employeeToUpdate = 
      core.Employees.FirstOrDefault(e => e.Name == employee.Name); 
     Mapper.Map(employee, employeeToUpdate); 
     return core; 
    } 
} 

映射将看像:

Mapper.CreateMap<Employee, Employee>(); // this map also required 
Mapper.CreateMap<ActionResult, Core>() 
     .ConvertUsing<ActionResultToCoreConverter>(); 

var result = MethodThatReturnsActionResultWithAnEmployee(); 
var core = new Core(); 
Mapper.Map(result, core); 
// if you want to create new Core instanse: 
var core2 = Mapper<Core>(result); 
+0

我想你提供了帮助但遗憾的是它不映射属性休息... IDK的为什么 –

+0

@DanialEugen在第二个方法,如果你有核心的一些性质应被映射的话,我想您应该在类型转换器中手动映射它们(因为对象使用自定义类型转换器映射)。员工的所有属性都应该映射而​​没有问题。 –