C# 自动映射:映射到受保护的属性

C# 自动映射:映射到受保护的属性,c#,automapper,C#,Automapper,我需要使用Automapper映射到类上的protected属性。我在这个类上公开了一个public方法,用于设置属性的值。此方法需要一个参数。如何将值映射到此类 目的地类别: public class Policy { private Billing _billing; protected Billing Billing { get { return _billing; }

我需要使用
Automapper
映射到类上的
protected
属性。我在这个类上公开了一个
public
方法,用于设置属性的值。此方法需要一个
参数
。如何将值映射到此类

目的地类别:

public class Policy
     {
         private Billing _billing;

         protected Billing Billing
             {
                get { return _billing; }
                set { _billing = value; }
             }

         public void SetBilling(Billing billing)
            {
                if (billing != null)
                {
                    Billing = billing;
                }
                else
                {
                    throw new NullReferenceException("Billing can't be null");
                }
            }
    }
下面是我的
Automapper
code(伪代码)的外观:

Mapper.CreateMap<PolicyDetail, Policy>()
          .ForMember(d => d.SetBilling(???), 
                          s => s.MapFrom(x => x.Billing));
Mapper.CreateMap()
.FormMember(d=>d.SetBilling(?),
s=>s.MapFrom(x=>x.Billing));

我需要向SetBilling(Billing Billing)方法传递一个Billing类。我该怎么做?或者,我可以只设置受保护的计费属性吗?

最简单的方法:使用AfterMap/BeforeMap构造

Mapper.CreateMap<PolicyDetail, Policy>()    
.AfterMap((src, dest) => dest.SetBilling(src.Billing));
Mapper.CreateMap()
.AfterMap((src,dest)=>dest.SetBilling(src.Billing));

也可以:告诉AutoMapper识别受保护的成员:

Mapper.Initialize(cfg =>
{
    // map properties with public or internal getters
    cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
    cfg.CreateMap<Source, Destination>();
});
Mapper.Initialize(cfg=>
{
//使用公共或内部getter映射属性
cfg.ShouldMapProperty=p=>p.GetMethod.IsPublic | | p.GetMethod.IsAssembly;
CreateMap();
});

不需要额外的后置地图。默认情况下,AutoMapper会查找公共属性,您必须在全局或概要文件的基础上告诉它,以执行不同的操作()

这两个类的属性没有共享太多相同的名称。因此,我知道如何使用Automapper的唯一方法就是使用.ForMember。这就是为什么So是web上最好的技术资源的原因之一。你还可以在哪里提出问题,并让编写软件的人回答。哪个更有效?使用AfterMap或配置?更有效还是更明显?我喜欢使用更具语义的方法。AfterMap确实是核心选项,而且更容易出错。有没有一种非静态的方式,使用MapperConfiguration而不使用配置文件?@cdie我在我的示例中没有使用配置文件。但那个“cfg”的东西,和传递给MapperConfiguration构造函数的东西是一样的。只需将“Mapper.Initialize”替换为“new MapperConfiguration”