自动映射对象

AutoMapping objects

我有一个奇怪的情况,我有 objects 和 Lists of objects 作为我的实体和合同的一部分与第三方服务接口。我将尝试看看是否可以用实体和合同中更具体的内容替换实际对象 class 来解决这个问题,但我很好奇是否有办法让 AutoMapper 将其处理为是。

这里有一些虚拟 classes:

public class From
{
    public object Item { get; set; }
}

public class FromObject
{
    public string Value { get; set; }
}

public class To
{
    public object Item { get; set; }
}

public class ToObject
{
    public string Value { get; set; }
}

以及快速复制:

Mapper.CreateMap<From, To>();
Mapper.CreateMap<FromObject, ToObject>();

From from = new From { Item = new FromObject { Value = "Test" } };
To to = Mapper.Map<To>(from);
string type = to.Item.GetType().Name; // FromObject

基本上,问题是这样的:有没有办法让 AutoMapper 理解 from.Item 是一个 FromObject 并将映射应用到 ToObject?我在想可能没有办法让它自动,因为没有任何东西表明 to.Item 必须是 ToObject,但是有没有办法在 CreateMap 期间指定或 Map 呼吁应考虑到这一点?

我认为没有 "automatic" 的方法,因为 AutoMapper 无法弄清楚 From.ItemFromObjectTo.ItemToObject.

但是,在创建映射时,您可以指定

Mapper.CreateMap<FromObject, ToObject>();
Mapper.CreateMap<From, To>()
    .ForMember(dest => dest.Item, opt => opt.MapFrom(src => Mapper.Map<ToObject>(src.Item)));            

From from = new From { Item = new FromObject { Value = "Test" } };
To to = Mapper.Map<To>(from);
string type = to.Item.GetType().Name; // ToObject

如果您愿意使用额外的界面,可以使用 Include 来完成。但是,您不能仅以这种方式将 object 映射到 object

public class From
{
    public IItem Item { get; set; }
}

public class FromObject : IItem
{
    public string Value { get; set; }
}

public class To
{
    public object Item { get; set; }
}

public class ToObject
{
    public string Value { get; set; }
}

public interface IItem
{
    // Nothing; just for grouping.
}

Mapper.CreateMap<From, To>();
Mapper.CreateMap<IItem, object>()
    .Include<FromObject, ToObject>();

From from = new From { Item = new FromObject { Value = "Test" } };
To to = Mapper.Map<To>(from);
string type = to.Item.GetType().Name; // ToObject