AutoMapper忽略()问题

bjh*_*ine 3 c# automapper

好吧,我希望我只是在某种程度上忽略了显而易见的事实.我在下面有以下代码情况.由于某种原因,即使我正在调用Ignore(),SequenceNo属性仍然会被映射.我正在使用最新的.我也在同一个项目中用两个不同的类对它进行了测试,它似乎有效,那么这个场景有什么问题呢?

这是域对象:

 public class CableID 
{
    private string _panelID1;
    public string PanelID1
    {
        get { return _panelID1; }
        private set { _panelID1 = value; }
    }

    private string _panelID2;
    public string PanelID2
    {
        get { return _panelID2; }
        private set { _panelID2 = value; }
    }

    private int _sequenceNo;
    public int SequenceNo
    {
        get { return _sequenceNo; }
        private set { _sequenceNo = value; }
    }

    private DateTime _inService;
    public DateTime InService
    {
        get { return _inService; }
        set { _inService = value; }
    }

    private string _id;
    public string ID
    {
        get { return _id; }
        private set { _id = value; }
    }

    public CableID(string panelID1, string panelID2, int sequenceNo)
    {
        this.PanelID1 = panelID1;
        this.PanelID2 = panelID2;
        this.SequenceNo = sequenceNo;
        this.ID = string.Format("({0}-{1}){2}", this.PanelID1, this.PanelID2, this.SequenceNo);
    }

    public CableID(string id)
    {
        if (string.IsNullOrEmpty(id))
            throw new ArgumentNullException("id");

        this.ID = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是DTO对象:

public class CableIDDTO
{
    private string _panelID1;
    public string PanelID1
    {
        get { return _panelID1; }
        set { _panelID1 = value; }
    }

    private string _panelID2;
    public string PanelID2
    {
        get { return _panelID2; }
        set { _panelID2 = value; }
    }

    private int _sequenceNo;
    public int SequenceNo
    {
        get { return _sequenceNo; }
        set { _sequenceNo = value; }
    }

    private string _id;
    public string ID
    {
        get { return _id; }
        set { _id = value; }
    }

    public CableIDDTO()
    { }

    public CableIDDTO(string panelID1, string panelID2, int sequenceNo)
    {
        this.PanelID2 = panelID1;
        this.PanelID1 = panelID2;
        this.SequenceNo = sequenceNo;
        this.ID = string.Format("({0}-{1}){2}", this.PanelID2, this.PanelID1, this.SequenceNo);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后是AutoMapper用例:

       CableID cableID = new CableID("A1", "B1", 2);
        Mapper.CreateMap<CableID, CableIDDTO>()
              .ForMember(dest => dest.SequenceNo, opt => opt.Ignore());

        CableIDDTO dto = Mapper.Map<CableID, CableIDDTO>(cableID);
Run Code Online (Sandbox Code Playgroud)

dto.SequenceNo = 2,因为我设置了Ignore()后它应该为0.

And*_*ker 5

这是因为AutoMapper正在找到这个CableIDDTO构造函数:

public CableIDDTO(string panelID1, string panelID2, int sequenceNo)
Run Code Online (Sandbox Code Playgroud)

并调用它,设置sequenceNo.我不确定它是如何或为什么这样做 - 我会继续挖掘.

您可以通过调用.ConstructUsing并告诉AutoMapper使用no-args构造函数来解决此问题:

Mapper.CreateMap<CableID, CableIDDTO>()
    .ConstructUsing((Func<CableID, CableIDDTO>)(src => new CableIDDTO()))
    .ForMember(dest => dest.SequenceNo, opt => opt.Ignore());
Run Code Online (Sandbox Code Playgroud)

经过进一步研究,这看起来像是AutoMapper中的一个功能,它试图将源属性名称与目标构造函数进行匹配.由于您的目标类型(CableIDDTO)曾与源(几个属性名称完全匹配了一个构造函数panelID1,panelID2,sequenceNo),该构造函数被调用.

禁用此功能的另一种方法是调用DisableConstructorMapping:

Mapper.Configuration.DisableConstructorMapping()
Run Code Online (Sandbox Code Playgroud)