AutoMapper使用了错误的构造函数

问题描述 投票:26回答:2

今天,我将一个使用 AutoMapper v1.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个args的构造函数。

然后我尝试使用

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

但我一直收到一个'模糊调用'的错误,我无法解决。

然后我尝试了

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

并成功地使用无参数构造函数创建了TypeOne对象,但却无法设置私有的setter属性。

我在AutoMapper网站上找过帮助,也下载了源码好好看了看,但是没有得到太多关于文档的帮助,而且ConstructUsing的单元测试也不多。

我有没有什么明显的遗漏,我应该用v2.1来改变?我很惊讶,它与v1.1相比有这么大的变化。

c# automapper automapper-2
2个回答
50
投票

您只需要添加 明投

Func<ResolutionContext, TypeOne>

下面是代码。

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

当前版本的AutoMapper工作原理如下所述。

  1. 按参数数量对目标类型构造函数进行排序

    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length);
    
  2. 取第一个参数与源属性相匹配的构造函数(不检查空值)。在你的例子中,它是一个有两个参数的构造函数。


0
投票

这里有一个扩展方法...

    public static void CreateMapWithDefaultConstructor<T, TU>(this Profile profile)
        where TU : class, new()
    {
        profile.CreateMap<T, TU>().ConstructUsing(source => new TU());
    }
© www.soinside.com 2019 - 2024. All rights reserved.