Я пытаюсь взять уже существующий объект и использовать automapper для сопоставления другого свойства из списка в него на основе ключа, уже находящегося в месте назначения.
Учитывая приведенный ниже фрагмент кода, описание состояния Resolve получит только StateCode, и мне нужно сопоставить StateName из списка состояний в объект.
public Location ResolveStateDescription(Location location)
{
var stateList = new List<State> {
new State { StateCode = "CA", StateName = "California" },
new State { StateCode = "CO", StateName = "Colorado" },
new State { StateCode = "NV", StateName = "Nevada" },
};
var mappedLocation = _mapper.Map(stateList, location);
return mappedLocation;
}
public class State
{
public string StateCode { get; set; }
public string StateName { get; set; }
}
public class Location
{
public string City { get; set; }
public string StateCode { get; set; }
public string StateName { get; set; }
}
Я уже сделал поэтому, используя Custom Resolver и профиль ниже. Мне интересно, есть ли более простой способ сделать это без особых накладных расходов.
public class StateMapProfile : Profile
{
public StateMapProfile()
{
CreateMap<List<State>, Location>()
.ForMember (dest => dest.StateName, opt => opt.MapFrom<StateCodeResolver>());
}
}
public class StateCodeResolver : IValueResolver<IEnumerable<State>, Location, string>
{
public string Resolve(IEnumerable<State> source, Location destination, string destMember,
ResolutionContext context)
{
return source
.Where(x => x.StateCode.Equals(destination.StateCode))
.Select(x => x.StateName).FirstOrDefault();
}
}