自动映射器是否可以使用计算所得的属性? 解决方案最终评论

说我有两节课:

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;

那么我的期望是错误的还是其他原因?

typingsoft2 回答:自动映射器是否可以使用计算所得的属性? 解决方案最终评论

通话:

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逻辑移至全尺寸方法,在该方法中可以引发由无效参数等引起的异常。也可以从属性中做到这一点,但问自己-您是否希望从属性获取器/设置器中获得这种行为,或者从方法中获得更多?

本文链接:https://www.f2er.com/3142836.html

大家都在问