AutoMapper - 嵌套通用对象映射

时间:2014-03-27 10:23:48

标签: object nested automapper

我正在学习用于映射实体的automapper。

我有一个名为MyResponse1的对象:

public class MyResponse1
{
     public bool IsSuccessful {get;set;}
     public string Message {get;set;}
     public Object ReturnedObject {get;set;}
}

比我有MyResponse2

public class MyResponse2
{
     public bool IsSuccessful {get;set;}
     public string Message {get;set;}
     public Object ReturnedObject {get;set;}
}

MyResponse1是源,MyResponse2是目的地,而不是我的类:

public class User1
{
    public int UserId {get;set;}
}
public class User2
{
    public int UserId {get;set;}
}

我的映射配置如下:

Mapper.CreateMap<User1, User2>();
Mapper.CreateMap<MyResponse1, MyResponse2>();

现在我喜欢:

MyResponse1 resp = new MyResponse1();
resp.IsSuccessful = true;
resp.Message = "User retreived.";
User1 oUser = new User1();
oUser.UserId = 1;
resp.ReturnedObject = oUser;

但是当我喜欢的时候:

MyResponse2 resp2 = Mapper.Map<MyResponse1, MyResponse2>(resp);

比resp2有User1作为返回对象,但我希望User2作为返回对象,我可以改变ReturnedObject的类型,因为我需要在其中发送不同类型的对象。

知道如何实现它吗?

修改 我使用的一种方法就是我这样做了它并且有效:

MyResponse2 resp2 = Mapper.Map<MyResponse1, MyResponse2>(resp);
resp2.ReturnedObject = Mapper.Map<User1, User2>(resp.ReturnedObject as User1);

还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您无法映射到目标ReturnedObject类型,因为在映射MyResponse1时它不存在。您在编辑中所做的正是这样,您将显式映射到已知类型。

自动化映射的唯一方法是声明MyResponse2可以期望的对象。也许将MyResponse2转换为泛型类型是一种可行的方法:

public class MyResponse2<T>
{
     public bool IsSuccessful {get;set;}
     public string Message {get;set;}
     public T ReturnedObject {get;set;}
}

然后你可以像这样概括映射过程:

private static void CreateMapFromUser1To<T>() where T: class {
    Mapper.CreateMap<MyResponse1, MyResponse2<T>>()
    .ForMember(destination => destination.ReturnedObject, opt => opt.Ignore()) // ignore the object
    .AfterMap((source, destination) => destination.ReturnedObject = Mapper.Map(source.ReturnedObject, source.ReturnedObject.GetType(), typeof(T)) as T);
}

你将无法从一个对象映射到...基本上没有,所以你需要一个destiantion类型。但坦率地说,你的应用程序可能有一个糟糕的设计,我建议退一步看看你想要实现的转换