Object 自动映射-嵌套的通用对象映射

Object 自动映射-嵌套的通用对象映射,object,nested,automapper,Object,Nested,Automapper,我正在学习映射实体的automapper 我有一个名为MyResponse1的对象: public class MyResponse1 { public bool IsSuccessful {get;set;} public string Message {get;set;} public Object ReturnedObject {get;set;} } 比我有更多的反应2 public class MyResponse2 { public bool

我正在学习映射实体的automapper

我有一个名为MyResponse1的对象:

public class MyResponse1
{
     public bool IsSuccessful {get;set;}
     public string Message {get;set;}
     public Object ReturnedObject {get;set;}
}
比我有更多的反应2

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>();
但当我喜欢的时候:

MyResponse2 resp2 = Mapper.Map<MyResponse1, MyResponse2>(resp);
myresponse2resp2=Mapper.Map(resp);
resp2将User1作为返回对象,但我希望User2作为返回对象,我无法更改ReturnedObject的类型,因为我需要在其中发送不同类型的对象

你知道如何实现吗

编辑: 我使用的一种解决方法是,我这样做,并且成功了:

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

还有其他更好的方法吗?

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

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

public class MyResponse2<T>
{
     public bool IsSuccessful {get;set;}
     public string Message {get;set;}
     public T ReturnedObject {get;set;}
}
公共类MyResponse2
{
公共布尔值IsSuccessful{get;set;}
公共字符串消息{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);
}
private static void CreateMapFromUser1To(),其中T:class{
Mapper.CreateMap()
.ForMember(destination=>destination.ReturnedObject,opt=>opt.Ignore())//忽略该对象
.AfterMap((source,destination)=>destination.ReturnedObject=Mapper.Map(source.ReturnedObject,source.ReturnedObject.GetType(),typeof(T))作为T);
}

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

基本上,我正在尝试在.asmx web服务上实现这种方法,这种设计就像web服务,而不是类库和客户端,客户端调用类库,类库调用web服务,当调用web服务时,返回对象的名称空间会发生更改,因此我尝试通过automapper将中间类库将对象映射回其原始名称空间,而不是webservice名称空间,我想我解释得很成功,如果你对此有任何想法,欢迎评论。
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);
}