【问题标题】:AutoMapper with prefix带前缀的 AutoMapper
【发布时间】:2012-02-17 00:58:15
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

    标签: c# automapper


    【解决方案1】:
    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);
    ...
    

    【讨论】:

    • 干杯这两种方法都可以完美运行。虽然这两种方法似乎并不特定于实际的映射 A 到 B,但实际上会影响任何其他映射,例如 A 到 C
    • @CliffMayson 但我认为这没有问题,尤其是在您有多个目标类遵循相同约定的情况下。在您确实需要单独配置的情况下,例如您需要有不同的逻辑来映射相同的两个类,您始终可以使用自己的配置创建专用的MappingEngines。 HTH。
    【解决方案2】:

    文档有一篇关于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 识别前缀“Get”,如果您需要清除前缀:

    Mapper.Initialize(cfg => {
        cfg.ClearPrefixes();
        cfg.RecognizePrefixes("tmp");
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2017-05-04
      • 2015-02-04
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      相关资源
      最近更新 更多