Как найти свойство источника на основе имени сплющенного свойства с AutoMapper

Я использую AutoMapper, и я хотел бы, чтобы он отслеживал исходное свойство на основе имени сопоставленного (сплющенного) целевого свойства.

Это связано с тем, что у моего контроллера MVC есть имя сопоставленного свойства, которое необходимо предоставить вызову службы для целей сортировки. Служба должна знать имя свойства, из которого было получено сопоставление (и контроллер не должен его знать), чтобы выполнить правильный вызов хранилища, которое фактически сортирует данные.

Например:

[Source.Address.ZipCode] отображается на [Destination.AddressZipCode]

Затем

Трассировка «AddressZipCode» обратно на [Source.Address.ZipCode]

Это то, что AutoMapper может сделать для меня или мне нужно прибегнуть к копанию в картографических данных AutoMapper?

ОБНОВЛЕНИЕ

Джимми Богард сказал мне, что это должно быть возможно, но не очевидным образом. Это требует загрузки карты типов и прохождения через нее. Я кратко рассмотрел это, но мне кажется, что мне нужен доступ к внутренним типам, чтобы получить информацию о сопоставлении свойств, которая требуется для обратного сопоставления.

ОБНОВЛЕНИЕ 2

Я решил предоставить некоторые дополнительные сведения.

Когда я загружаю карту типов, я обнаруживаю, что в ней есть два преобразователя значений источника для неявного отображения ZipCode:

  • a AutoMapper.Internal. Я мог бы решить эту проблему, либо просматривая распознаватели значений, либо просматривая пользовательский распознаватель, хотя я сомневаюсь, что это вернуло бы меня к лямбда-выражению сопоставления, которое мне нужно для построения неотличимого имени свойства (на самом деле это серия имен свойств, разделенных точек).

9
задан Sandor Drieënhuizen 7 August 2010 в 09:37
поделиться

1 ответ

Я столкнулся с подобной необходимостью с AutoMapper. Вот решение, которое я смог придумать. Я тестировал это только на очень простых отображениях. В основном, один класс к другому с использованием только свойств (в основном, поведение по умолчанию Mapper.CreateMap. Я предполагаю, что существует только одно отображение, поэтому я использую First вместо итерации по коллекциям.

    private MemberInfo getSource(Type destinationType, string destinationPropertyname)
    {
        TypeMap map = Mapper.GetAllTypeMaps().Where(m => m.DestinationType.Equals(destinationType)).First();

        IEnumerable<PropertyMap> properties = map.GetPropertyMaps().Where(p => p.DestinationProperty.Name.Equals(destinationPropertyname, StringComparison.CurrentCultureIgnoreCase));

        PropertyMap sourceProperty = properties.First();

        IMemberGetter mg = sourceProperty.GetSourceValueResolvers().Cast<IMemberGetter>().First();

        return mg.MemberInfo;
    }
1
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: