如何使用Automapper构造没有默认构造函数的对象

21

我的对象没有默认构造函数,它们都需要一个签名

new Entity(int recordid);

我添加了以下这行代码:

Mapper.CreateMap<EntityDTO, Entity>().ConvertUsing(s => new Entity(s.RecordId));

这解决了Automapper期望有默认构造函数的问题,然而只映射的元素是记录ID。

如何让它使用正常的映射方式?如何使所有实体的属性都被映射,而不必手动映射属性?


RecordId是从哪里来的?EntityDTO吗?如果是这样,最新版本的AutoMapper(可在AutoMapper.org上找到)支持映射构造函数参数,这可能会对您有所帮助。 - Jimmy Bogard
1
你需要使用ConstructUsing。详见此答案 - boca
2个回答

39

你可以使用 ConstructUsing 替代 ConvertUsing。这是一个演示:

using System;
using AutoMapper;

public class Source
{
    public int RecordId { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
}

public class Target
{
    public Target(int recordid)
    {
        RecordId = recordid;
    }

    public int RecordId { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
}


class Program
{
    static void Main()
    {
        Mapper
            .CreateMap<Source, Target>()
            .ConstructUsing(source => new Target(source.RecordId));

        var src = new Source
        {
            RecordId = 5,
            Foo = "foo",
            Bar = "bar"
        };
        var dest = Mapper.Map<Source, Target>(src);
        Console.WriteLine(dest.RecordId);
        Console.WriteLine(dest.Foo);
        Console.WriteLine(dest.Bar);
    }
}

ConvertUsing在从ViewModel到Model的映射中提供了更多的灵活性。我能否将ConstructUsing与ConvertUsing一起使用?我想在使用构造函数映射从ViewModel到Model时只映射几个属性,但是在从Model到ViewModel的映射中应该映射所有属性。 - akd
有没有办法使它更通用?用例:从父级转换为子级,无论父级中不存在哪些字段,在子级中将它们传递为null。 - user1324887

8

尝试

Mapper.CreateMap<EntityDTO, Entity>().ConstructUsing(s => new Entity(s.RecordId));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接