好的,我希望我只是在某种程度上忽视了显而易见的事实。我在下面有以下代码情况。出于某种原因,即使我正在调用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;
}
}
这是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);
}
}
最后是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);
dto.SequenceNo = 2,因为我设置了Ignore()后它应该为0.
答案 0 :(得分:5)
这是因为AutoMapper正在找到这个CableIDDTO
构造函数:
public CableIDDTO(string panelID1, string panelID2, int sequenceNo)
并调用它,设置sequenceNo
。我不完全确定它是如何或为什么这样做的 - 我会继续挖掘。
您可以通过调用.ConstructUsing
并告诉AutoMapper使用no-args构造函数来解决此问题:
Mapper.CreateMap<CableID, CableIDDTO>()
.ConstructUsing((Func<CableID, CableIDDTO>)(src => new CableIDDTO()))
.ForMember(dest => dest.SequenceNo, opt => opt.Ignore());
经过进一步研究,这看起来像是AutoMapper中的一个功能,它试图将源属性名称与目标构造函数进行匹配。由于目标类型(CableIDDTO
)的构造函数与源(panelID1
,panelID2
,sequenceNo
)上的多个属性名称完全匹配,因此调用了该构造函数。
禁用此功能的另一种方法是致电DisableConstructorMapping
:
Mapper.Configuration.DisableConstructorMapping()