2012-02-17 109 views
17

的AutoMapper我试图使用Automapper来映射到对象,问题是我试图映射的对象之一在其所有属性前有一个前缀'Cust_',而其中一个没有。有没有办法做这个映射。带有前缀

例如说我有

class A 
{ 
     String FirstName { get; set; } 
     String LastName { get; set; } 
} 

class B 
{ 
     String Cust_FirstName { get; set; } 
     String Cust_LastName { get; set; } 
} 

显然,这种地图将无法正常工作

AutoMapper.Mapper.CreateMap<A, B>(); 
b = AutoMapper.Mapper.Map<A, B>(a); 

回答

22
Mapper.Initialize(cfg => 
{ 
    cfg.RecognizeDestinationPrefixes("Cust_"); 
    cfg.CreateMap<A, B>(); 
}); 

A a = new A() {FirstName = "Cliff", LastName = "Mayson"}; 
B b = Mapper.Map<A, B>(a); 

//b.Cust_FirstName is "Cliff" 
//b.Cust_LastName is "Mayson" 

或者:

Mapper.Configuration.RecognizeDestinationPrefixes("Cust_"); 
Mapper.CreateMap<A, B>(); 
... 
B b = Mapper.Map<A, B>(a); 
... 
+2

干杯这两种方法很好地工作。虽然这两种方法似乎都不是特定于实际的地图A到B,但实际上会影响任何其他映射,比如说A到C – 2012-02-17 05:11:33

+0

@CliffMayson,但我不认为这是有问题的,尤其是在您有多个遵循同一个约定的目标类。在确实需要单独配置的情况下,例如,如果您需要使用不同逻辑来映射相同的两个类,则始终可以使用它们自己的配置创建专用的MappingEngine。 HTH。 – 2012-02-18 04:23:53

0

文档对Recognizing pre/postfixes文章

有时您的源/目标属性将具有常见的前/后缀,导致您必须执行一堆自定义成员映射,因为名称不匹配。为了解决这个问题,你可以识别前/后缀:

public class Source { 
    public int frmValue { get; set; } 
    public int frmValue2 { get; set; } 
} 
public class Dest { 
    public int Value { get; set; } 
    public int Value2 { get; set; } 
} 
Mapper.Initialize(cfg => { 
    cfg.RecognizePrefix("frm"); 
    cfg.CreateMap<Source, Dest>(); 
}); 

Mapper.AssertConfigurationIsValid(); 默认AutoMapper识别前缀“获取”,如果你需要清除前缀:

Mapper.Initialize(cfg => { 
    cfg.ClearPrefixes(); 
    cfg.RecognizePrefixes("tmp"); 
}); 
相关问题