假设我有以下类
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);
}