Я думаю, что, когда это возможно, лучше избегать ручного указания отображений между свойствами. Я не уверен, есть ли в вашем случае веская причина, почему это AProductKey
и BProductKey
, а не просто ProductKey
в обоих (что AutoMapper будет обрабатывать для вас автоматически). Если проблема связана с сериализацией, лучшим подходом в ваших классах может быть использование атрибута JsonProperty
для сопоставления объекта JSON с более поддерживаемым свойством в C #.
В любом случае, вы можете указать отображение для определенных свойств, используя AutoMapper (рекомендуемый способ):
Mapper.Initialize(cfg =>
{
cfg.CreateMap<ARequest, BRequest>()
.ForMember(dest => dest.BText, o => o.MapFrom(src => src.AText))
.ForMember(d => d.BProductKey, o => o.MapFrom(s => s.AProductKey))
.ForMember(d => d.BSettings, o => o.MapFrom(s => s.ASettings));
});
Или, если вам нужен более опасный параметр, который спасает вас при сопоставлении каждого свойства по отдельности (я бы избежал этого в рабочем коде):
Mapper.Initialize(cfg =>
{
cfg.CreateMap<ARequest, BRequest>()
.ForAllMembers(mo =>
{
var convertedName = mo.DestinationMember.Name;
if (convertedName.StartsWith("B"))
{
convertedName = "A" + convertedName.Substring(1);
}
mo.MapFrom(convertedName);
});
});
В качестве альтернативы, вы можете сделать это без AutoMapper, добавив в BRequest конструктор, который принимает ARequest:
public class BRequest
{
public BRequest() { }
public BRequest(ARequest source)
{
this.BText = source.AText;
this.BProductKey = source.AProductKey;
this.BSettings = source.ASettings;
}
public string BText { get; set; }
public string BProductKey { get; set; }
public string BSettings { get; set; }
}