AutoMapper - 映射没有`set;`实现的属性

时间:2015-12-29 14:37:24

标签: c# automapper

是否有某种方法可以映射没有IList<>方法的set;属性?

来源类:

public class SourceClass
{
    private IList<string> strings;

    public IList<string> Strings { get { return this.strings; } }

    public SourceClass() { this.strings = new List<string>() { "s1", "s2", "s3" };
    //...
}

Destionation Class:

public class DestinationClass
{
    private IList<string> strings;

    public IList<string> Strings { get { return this.strings; } }

    public DestinationClass() { this.strings = new List<string>();
    //...
}

如您所见,这两个班都没有实施set;。结果是,当我执行AutoMapper.Mapper.Map<SourceClass, DestinationClass>(source, destination)时,Strings属性为空。

显而易见的解决方案是提供set;实现DestinationClass,但是,我想知道如何提供自定义配置以解决这些问题。

目前,我的配置是:

public class XProfile : AutoMapper.Profile
{
    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<SourceClass, DestinationClass>();
    }
}

3 个答案:

答案 0 :(得分:2)

您可以将AutoMapper配置为识别非公开成员。 查看documentation

答案 1 :(得分:1)

如果你正在使用不可变对象,我建议你将它作为参数传递给目标类,它将是这样的:

end

AutoMapper.Mapper.CreateMap<SourceClass, DestinationClass>() .ConstructUsing(s => new DestinationClass(s.Strings))

DestinationClass

答案 2 :(得分:1)

你可以像这样创建一个构造函数。

public class DestinationClass
{
    private IList<string> strings;

    public IList<string> Strings { get { return this.strings; } }

    public DestinationClass() : this(new List<string>()) { }

    public DestinationClass(IList<string> strs) {
        strings = strs.ToList(); // clone it
    }
    //...
}

然后,您可以使用ConstructUsing方法进行映射,告诉AutoMapper调用您创建的构造函数。

public class XProfile : AutoMapper.Profile
{
    protected override void Configure()
    {
        AutoMapper.Mapper.CreateMap<SourceClass, DestinationClass>()
            .ConstructUsing(x => new DestinationClass(x.Strings));
    }
}