说我有两节课:
public class UnitFilter
{
public int[] LanguageIds { get; set; } = { 1 };
public int LanguageId
{
get => LanguageIds[0];
set => LanguageIds = new int[value];
}
some properties
}
public class SomeOtherFilter
{
public int LanguageId {get;set;}
some properties
}
我想将SomeOtherFilter映射到UnitFilter
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<SomeOtherFilter , UnitFilter>().ReverseMap();
});
mapper = config.CreateMapper();
var request = new SomeOtherFilter(){LanguageId = 3};
var mappedRequest = mapper.Map<UnitFilter>(request);
我认为,作为UnitFilter的LangugeId属性的set方法正在设置LanguageIds数组,我希望这样做:
mappedRequest.LangugeId =3;
mappedRequest.LangugeIds[0] =3;
但是,我得到的是:
mappedRequest.LangugeId =0;
mappedRequest.LangugeIds[0] =0;
那么我的期望是错误的还是其他原因?
答案 0 :(得分:0)
通话:
var unitFilter = new UnitFilter();
会将单元素整数数组[1]
设置为LanguageIds
属性,因为这是您配置的初始值。现在,您具有LanguageId
属性的自定义设置器逻辑,该逻辑分配一个长度为n
的零数组,其中n
是传递给LanguageId
设置器的值。考虑到这一点,请致电:
var unitFilter = new UnitFilter
{
LanguageId = 2,
};
会将两个零[0, 0]
的数组设置为LanguageIds
属性。首先,将默认值[1]
设置为LanguageIds
作为初始值。然后,当LanguageId
设置程序被触发时,将两个元素的零数组[0, 0]
设置为LanguageIds
属性,因为2
是传递给设置程序的值。
自行测试:
var source = new UnitFilter();
var source2 = new UnitFilter
{
LanguageId = 2,
};
var result = mapper.Map<SomeOtherFilter>(source);
var result2 = mapper.Map<SomeOtherFilter>(source2);
您的问题出在UnitFilter
类的属性不正确,而不是AutoMapper。
最后,请允许我在编写本文时对您的代码发表评论。如果将值-1
分配给LanguageId
属性,会发生什么情况?如果我将null
分配给LanguageIds
数组(因为我可以,setter是公共的)然后尝试获取LanguageId
的值,会发生什么?看到,这些都是小信号,说明UnitFilter
类的属性的设置程序和获取程序中存在太复杂的逻辑。如果属性getter或setter有多个输出(尤其是在进行输入数据验证时),则应强烈考虑将getter / setter逻辑移至全尺寸方法,在该方法中可以引发由无效参数等引起的异常。也可以从属性中做到这一点,但问自己-您是否希望从属性获取器/设置器中获得这种行为,或者从方法中获得更多?