Как я могу вызвать метод расширения во время сопоставления со всеми исходными членами, которые имеют пользовательский атрибут? - PullRequest
0 голосов
/ 23 октября 2018

Я использую AutoMapper v6.1.1 для сопоставления сущностей модели моего расширенного домена с некоторыми плоскими DTO.

Я инициализирую конфигурацию в статическом классе, который возвращает IMapper, который добавляет нашсопоставляет профили и настраивает PreserveReferences() для всех наших карт.

Я объявил пользовательский атрибут для подмножества моих исходных элементов сущности (это относится только к элементам типа string).

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

Каждый из этих элементов будет в конечном итоге иметь множество различных типов назначения, поэтому я подумал, что это будет простой способ обеспечить всегда запуск метода расширения для этих элементов без явной настройки его для каждой новой карты.

Придуманный пример следует.

Исходный объект:

public class SomeEntity
{
    public string PropertyWithoutCustomAttribute { get; set; }

    [CustomAttribute]
    public string PropertyWithCustomAttribute { get; set; }
}

Целевой объект:

public class SomeEntityDto
{
    public string PropertyWithoutCustomAttribute { get; set; }

    public string PropertyWithCustomAttribute { get; set; }
}

Метод расширения:

public static string AppendExclamationMark(this string source)
{
    return source + "!";
}

Если мой исходный экземпляр определен со следующими значениями:

var source = new SomeEntity
{
    PropertyWithoutCustomAttribute = "Hello",
    PropertyWithCustomAttribute = "Goodbye"
};

Я ожидаю, что следующие утверждения будут истинными:

destination.PropertyWithoutCustomAttribute == "Hello"
destination.PropertyWithCustomAttribute == "Goodbye!"

Я полностью застрял (и немного борюсь с документацией), но я думаю, что самое близкое, что я получил, это:

cfg.ForAllPropertyMaps(
    map => map.SourceType == typeof(string) &&
           map.SourceMember
               .GetCustomAttributes(
                   typeof(CustomAttribute),
                   true)
               .Any(),
    (map, configuration) => map.???);

Любая помощь будет принята с благодарностью, дажеесли сказать мне, что это ужасная идея или это невозможно.

...