2

アプリケーションに沿ったメソッドが返す ActionResult というエンティティがあります。ここで、ActionResult で返されたオブジェクトを、そのオブジェクトの配列内の適切な場所にマップしたいと考えています...

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
        }
    };
}

ご覧のとおり、私がやりたいことは、メソッドから返された従業員を取得し、コア内の従業員の配列を検索し、AutoMapper を使用して新しい特定のデータを使用して更新することです。

4

1 に答える 1

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);
于 2013-10-20T21:46:35.273 に答える