【问题标题】:Mapping all properties of 'X' type with AutoMapper使用 AutoMapper 映射“X”类型的所有属性
【发布时间】:2010-03-07 02:03:22
【问题描述】:

我刚刚开始使用 AutoMapper,到目前为止发现它非常简单且省时。

只有一件事我不确定 - 如何以相同的方式映射给定类型的所有属性?

这可以通过 AutoMapper 在单个语句中使用 lambda 来完成,就像使用常规映射一样?

【问题讨论】:

  • 试试这个valueinjecter.codeplex.com,它的设计目的是首先将特定类型的所有道具映射到另一个道具
  • 感谢@Omu。为什么不将其添加为答案?

标签: c# model-view-controller lambda automapper


【解决方案1】:

您要查找的内容称为CustomTypeConverter。这些是全局范围的,只需要配置一次。

语法是:

Mapper.CreateMap<TSourceProperty,TDestinationProperty>().ConvertUsing(argument);

argument 可以在哪里

  1. ITypeConverter&lt;TSourceProperty,TDestinationProperty&gt; 的实现
  2. 一个Func&lt;TSourceProperty,TDestinationProperty&gt;

Jimmy Bogard 在http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/automapper-feature-custom-type-converters.aspx 上有一篇关于实现CustomTypeConverters 的文章。

CustomTypeConverter page of the AutoMapper documentation 中还提供了更多信息。

哦,顺便说一下(因为我想要 Omu 的赏金)你也可以通过切换到 valueinjecter 来做到这一点。

【讨论】:

  • 如果您需要不同的算法来从 int 转换为 Foo 以获得更多映射(可能您必须在映射之前每次调用 CreateMap),或者如果您需要 map从继承某个基类到int的所有类型,你会怎么做
  • 您只需要对每个应用程序实例调用一次CreateMap。如果您需要在不同的上下文中以不同的方式将int 映射到Foo,那么您应该将其声明为基于属性的映射而不是基于类型的映射。在这些情况下,您可以使用Custom Value Resolvers 指定复杂的intFoo 的映射,并声明Mapper.CreateMap&lt;Source, Destination&gt;().ForMember(dest =&gt; dest.Total, opt =&gt; opt.ResolveUsing&lt;CustomResolver&gt;());
  • @Omu,要映射所有继承某个基类的类型,可以使用反射获取所有派生类型,然后循环遍历并调用CreateMap。这可能代价高昂,可能应该在您的 IoC 配置中完成,但静态调用看起来像 void MapSubTypes&lt;TBase,TDestination&gt;(){foreach(var subType in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a =&gt; a.GetTypes().Where(t =&gt; typeof (TBase).IsAssignableFrom(t)))){ Mapper.CreateMap(subType,typeof(TDestination));} 。如果我犯了语法错误,请原谅我 - 在评论框中很难编码
  • 嗯,这是两种技术之间的一个很大区别,automapper 非常严格,你必须为任何微小的东西编写大量配置,并且所有这些配置都用于所有 map 调用加上内置的(扁平化 Get + Method to prop 等),无论你是否需要。
  • @Omu,我认为 AutoMapper 很棒,但我从未使用过您的产品。你听起来对它很有信心。我将不得不试一试,以便我可以进行诚实的比较。
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2017-05-26
  • 2021-02-27
  • 2015-10-27
  • 2017-05-19
相关资源
最近更新 更多