自动映射对象
AutoMapping objects
我有一个奇怪的情况,我有 object
s 和 List
s of object
s 作为我的实体和合同的一部分与第三方服务接口。我将尝试看看是否可以用实体和合同中更具体的内容替换实际对象 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.Item
是 FromObject
而 To.Item
是 ToObject
.
但是,在创建映射时,您可以指定
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
我有一个奇怪的情况,我有 object
s 和 List
s of object
s 作为我的实体和合同的一部分与第三方服务接口。我将尝试看看是否可以用实体和合同中更具体的内容替换实际对象 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.Item
是 FromObject
而 To.Item
是 ToObject
.
但是,在创建映射时,您可以指定
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