Asp.net mvc 自动映射使用接口 接口父级 { 字符串A; 字符串C; } A类:家长 { 字符串A; 字符串C; } B类:家长 { 字符串A; 字符串C; } 类相关的 { 字符串A; B串; } //应用程序启动时 CreateMap(); //仅地图成员A //在别的班 var rel//RelatedC类型对象,不为null,包含数据 var obj//ChildA类型对象,不为null,包含数据 //我想使用上面创建的映射来映射rel和obj 映射器映射(相对,对象) //只有属性A将被rel覆盖,obj的其他属性不会更改

Asp.net mvc 自动映射使用接口 接口父级 { 字符串A; 字符串C; } A类:家长 { 字符串A; 字符串C; } B类:家长 { 字符串A; 字符串C; } 类相关的 { 字符串A; B串; } //应用程序启动时 CreateMap(); //仅地图成员A //在别的班 var rel//RelatedC类型对象,不为null,包含数据 var obj//ChildA类型对象,不为null,包含数据 //我想使用上面创建的映射来映射rel和obj 映射器映射(相对,对象) //只有属性A将被rel覆盖,obj的其他属性不会更改,asp.net-mvc,automapper,Asp.net Mvc,Automapper,我想为所有将使用接口的类使用接口映射器,我不想为每个子类创建单独的映射。 如何实现这一点?您可以使用DynamicMap: interface Parent { string A; string C; } class ChildA : Parent { string A; string C; } class ChildB : Parent { string A; string C; } class RelatedC { st

我想为所有将使用接口的类使用接口映射器,我不想为每个子类创建单独的映射。
如何实现这一点?

您可以使用
DynamicMap

interface Parent
{
     string A;
     string C;
}
class ChildA : Parent
{
     string A;
     string C;
}
class ChildB : Parent
{
     string A;
     string C;
}

class RelatedC
{
     string A;
     string B;
}
//On app start
Mapper.CreateMap<Parent,RelatedC>();
//Map member A only 

//In some other class
var rel // RelatedC type object, not null has data
var obj// ChildA type object, not null has data
//I want to use the above map created to map rel and obj
Mapper.Map(rel ,obj )
//only property A will be overridden by rel, other properties for obj are not changed
这将映射
A
,并保留
C
的值。它不创建新实例,并且值直接映射到目标类型的对象(在本例中为
childA

编辑:显然,只有先注册映射,它才有效:

Mapper.DynamicMap(relatedC, childA);
Mapper.CreateMap();

你就不能只做
var obj=Mapper.Map(rel)
?我认为您不需要为每个
父实现者
配置映射。@Jasen不,我不能这样做,因为项目中使用的obj不是使用new实现的,它具有属性,并且使用var obj=Mapper。Map(rel)基本上会生成一个新对象。所以rel将覆盖obj的一些属性(那些将被映射的属性),我已经尝试过了,显然这不起作用。它将无法映射,因为它给出了错误,因为除了接口之外,类没有映射,这是最初的问题。您应该检查代码。它按预期工作。例如,您的
Parent
接口甚至不会像问题中提供的那样编译。
Mapper.CreateMap<RelatedC, Parent>();