Вы можете сделать следующее.Учитывая ваш тип источника.
var src = new Source();
src.ID = 1;
src.Name = "Test";
src.Address = "<Country>MyCountry</Country><Prefecture>MyPrefecture</Prefecture><City>MyCity</City>";
Поскольку ваш тип источника (src.Address) не имеет корневого элемента, давайте добавим его и проанализируем xml в XDocument.
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
Теперь во время инициализации Automapper вам необходимо сопоставить поля.
Mapper.Initialize(cfg =>
cfg.CreateMap<XElement, Destination>()
.ForMember(dest => dest.Country, opt => opt.MapFrom(x=>x.Element(nameof(Destination.Country)).Value))
.ForMember(dest => dest.City, opt => opt.MapFrom(x => x.Element(nameof(Destination.City)).Value))
.ForMember(dest => dest.Prefecture, opt => opt.MapFrom(x => x.Element(nameof(Destination.Prefecture)).Value)));
Теперь вы можете разрешить его следующим образом.
Destination result = Mapper.Map<XElement, Destination>(xdoc.Root);
Обновление
Вы также можете использовать ConstructUsing для этой цели, что позволит скрыть связанный с Xml код от других ваших кодов.
var src = new Source();
src.ID = "1";
src.Name = "Test";
src.Address = "<Country>MyCountry</Country><Prefecture>MyPrefecture</Prefecture><City>MyCity</City>";
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
Mapper.Initialize(cfg =>
cfg.CreateMap<Source, Destination>()
.ConstructUsing(x=>ConstructDestination(x))
);
Где ConstructDestination определяется как
static Destination ConstructDestination(Source src)
{
XDocument xdoc = new XDocument();
xdoc = XDocument.Parse($"<Root>{src.Address}</Root>");
return new Destination
{
Country = xdoc.Root.Element(nameof(Destination.Country)).Value,
City = xdoc.Root.Element(nameof(Destination.City)).Value,
Prefecture = xdoc.Root.Element(nameof(Destination.Prefecture)).Value,
};
}
Ваш клиентский код теперь выглядит намного чище.
Destination result = Mapper.Map<Source, Destination>(src);