AutoMapper使用了错误的构造(AutoMapper using the wrong cons

2019-07-30 02:21发布

今天我升级使用AutoMapper 1.1版到现在使用AutoMapper V2.1全功能的应用程序,我对面,我用以前的版本从未遇到过的一些问题来了。

这是我的代码映射的示例从DTO对象

public class TypeOne
{
   public TypeOne()
   {
   }

   public TypeOne(TypeTwo two)
   {
      //throw ex if two is null
   }

   public TypeOne(TypeTwo two, TypeThree three)
   {
      //throw ex if two or three are null
   }

   public TypeTwo Two {get; private set;}

   public TypeThree Three {get; private set;}
}

public class TypeOneDto
{
   public TypeOneDto()
   {
   }

   public TypeTwoDto Two {get; set;}

   public TypeThreeDto Three {get; set;}
}

...

Mapper.CreateMap<TypeThreeDto, TypeThree>();
Mapper.CreateMap<TypeTwoDto, TypeTwo>();
Mapper.CreateMap<TypeOneDto, TypeOne>();

var typeOne = Mapper.Map<TypeOne>(typeOneDto);

不过,我与V2.1遇到的第一个问题是,AutoMapper试图用2个ARGS构造时,args来一个为空,应使用1个参数的构造函数。

然后我试图使用

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());

但我一直得到我解决不了的“暧昧调用”的错误。

然后,我尝试

Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());

而且也成功地创建使用参数的构造函数的TypeOne对象,但随后没有设置专用setter属性。

我已经看过了AutoMapper网站上的帮助和下载的源代码有一个良好的外观,但没有提供有关文档很少得到远没有许多单元测试ConstructUsing。

有什么明显我很想念我应该用V2.1改变? 我很惊讶,它已经改变了从V1.1这么多。

Answer 1:

你只需要添加显式转换到

Func<ResolutionContext, TypeOne>

下面是代码:

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(
            (Func<ResolutionContext, TypeOne>) (r => new TypeOne()));

AutoMapper的当前版本的作品如介绍如下:

  1. 通过参数计数排序目的地类型构造

     destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length); 
  2. 采用哪些参数匹配源属性(没有任何检查空值)的第一构造函数。 在你的情况下,构造有两个参数。



文章来源: AutoMapper using the wrong constructor