我正在学习用于映射实体的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);
还有其他更好的方法吗?
答案 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类型。但坦率地说,你的应用程序可能有一个糟糕的设计,我建议退一步看看你想要实现的转换