我希望能够映射到IFoo.IBar.Name 而不用自己创建IBar类型的具体对象。
在CreateMap级别使用代理很容易:Mapper.CreateMap<Person, IFoo>()
,但如何为自定义内部接口类型成员实现它?
public class Test
{
[Fact]
public void MapToInnerInterface()
{
const int id = 1;
const string name = "Peter";
var person = new Person {Id = id, Name = name};
Mapper.CreateMap<Person, IFoo>()
.ForMember(dest => dest.Bar.Name, c => c.MapFrom(src => src.Name));
var mapResult = Mapper.Map<IFoo>(person);
Assert.Equal(id, mapResult.Id);
Assert.Equal(name, mapResult.Bar.Name);
}
}
public interface IFoo
{
int Id { get; set; }
IBar Bar { get; set; }
}
public interface IBar
{
string Name { get; set; }
}
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
答案 0 :(得分:3)
您可以通过将外部类(Person
)映射到内部接口(IBar
),然后在Person
→IFoo
地图中利用该地图来实现此目的
Mapper.CreateMap<Person, IFoo>()
.ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src));
Mapper.CreateMap<Person, IBar>();
IFoo foo = Mapper.Map<IFoo>(person);
Console.WriteLine(foo.Bar.Name); // Peter
Console.WriteLine(foo.Id); // 1
创建了两个代理对象,一个实现IFoo
,另一个实现IBar
,正如您所期望的那样。
答案 1 :(得分:0)
我希望能够在不创建IBar类型的具体对象的情况下映射到IFoo.IBar.Name
您如何期望AutoMapper知道IBar
接口使用的具体类型?如您所知,您不能拥有接口的实例。有人必须指定哪种是具体类型,而且这绝对不是AutoMapper能够做的事情。
您应该在IBar
类型或AfterMap
选项上使用自定义解析程序,以便指明应如何完成此映射。