自动映射器:取消展平到构造函数



假设我有以下类

class Foo
{
    public Bar First { get; }
    public Bar Second { get; }
    public Foo(Bar first, Bar second)
    {
        First = first;
        Second = second;
    }
}
class Bar
{
    public string Name { get; set; }
}
class FooDto
{
    public string FirstName { get; set; }
    public string SecondName { get; set; }
}

我想将FooDto映射到Foo.我已经阅读了有关反向映射和取消拼合的信息,因此我像这样设置了我的凝聚:

IMapper mapper = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Foo, FooDto>()
        .ReverseMap();
}).CreateMapper();

不幸的是,这失败了

System.ArgumentException :Test.AutoMapper.Foo 需要有一个具有 0 个参数或仅具有可选参数的构造函数。

如何将自动映射器配置为使用 Foo 构造函数,而无需手动映射所有构造函数参数?(在我的实际代码中,类型具有更多属性(

您必须显式声明转换,因为构造函数参数和属性名称的名称不同。有关更多信息,请查看文档。

下面是一个运行示例:

public static void Main()
{
    var configuration = new MapperConfiguration(config =>
    {
        config.CreateMap<FooDto, Foo>()
            .ForCtorParam("first", opt => opt.MapFrom(src => src.FirstName))
            .ForCtorParam("second", opt => opt.MapFrom(src => src.SecondName));
        config.CreateMap<string, Bar>().ConvertUsing(value => new Bar() { Name = value });
    });
    var mapper = configuration.CreateMapper();
    var dto = new FooDto() { FirstName = "Hello", SecondName = "World" };
    var foo = mapper.Map<Foo>(dto);
    Console.WriteLine(foo.First.Name);
    Console.WriteLine(foo.Second.Name);
}

相关内容

最新更新