Automapper-在不创建具体类的情况下映射到Interface类型属性

本文关键字:映射 情况下 Interface 属性 类型 创建 Automapper- | 更新日期: 2023-09-27 18:28:53

我希望能够映射到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; }
}

Automapper-在不创建具体类的情况下映射到Interface类型属性

您可以通过将外部类(Person)映射到内部接口(IBar),然后在Person中利用该映射来实现这一点→CCD_ 5图谱。

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,正如您所期望的那样。

示例:https://dotnetfiddle.net/VuyT1K

我希望能够映射到IFoo.IBar.Name,而无需自己创建类型为IBar的具体对象

您希望AutoMapper如何知道IBar接口使用什么具体类型?正如您所知,您不能拥有接口的实例。必须有人指定哪种是这种具体类型,而这绝对不是AutoMapper能够做到的。

您应该在IBar类型或AfterMap选项上使用自定义解析器,以便指示应该如何进行此映射。