Как игнорировать всех участников назначения, кроме отображенных?

Как это сделать? У нас есть SummaryDto, который 9X_c#-language сопоставляет три разных типа, и когда мы 9X_c# создаем карту для каждого типа, свойства, которые 9X_c#.net не сопоставлены, выдают ошибку. В сводке 9X_automapper dto около 35 атрибутов. Использовать опцию 9X_.cs-file Ignore() для каждого из них - слишком большая 9X_automapper проблема. Есть ли глобальный игнор? Что-то 9X_c#.net вроде

CreateMap()
   .IgnoreAllUnmapped();

82
2

  • Это кажется хорошим делом, однако, несмотря на то, что в вашем DTO 35 свойств, если вы используете `AutoMapper.Mapper.A ...
5
Общее количество ответов: 5

Ответ #1

Ответ на вопрос: Как игнорировать всех участников назначения, кроме отображенных?

Это работает для меня:

public static class MappingExpressionExtensions
{
    public static IMappingExpression IgnoreAllUnmapped(this IMappingExpression expression)
    {
        expression.ForAllMembers(opt => opt.Ignore());
        return expression;
    }
}

Поскольку ForAllMembers возвращает 9X_automapper void, вызов ForAllMembers(o => o.Ignore()) без этого метода расширения работать 9X_csharp не будет. Мы хотим, чтобы выражение сопоставления 9X_automapper оставалось доступным для включения последующих 9X_c#-language сопоставлений:

CreateMap()
            .IgnoreAllUnmapped()
            .ForMember(d => d.Text, o => o.MapFrom(s => s.Name))
            .ForMember(d => d.Value, o => o.MapFrom(s => s.Id));

139
6

  • @jsgoupil AutoMapper 11 устарел ForAllOtherMemb ...

Ответ #2

Ответ на вопрос: Как игнорировать всех участников назначения, кроме отображенных?

Я тоже долго боролся с этим, по крайней 9X_c# мере, с проблемой, похожей на эту. У меня 9X_c-sharp был класс с множеством свойств (около 30), и 9X_csharp я хотел отобразить только 4 из них. Кажется 9X_visual-c# безумием добавлять 26 операторов игнорирования 9X_.cs-file (особенно когда это означает, что будущие 9X_c-sharp изменения в классе будут означать их обновление!)

Я 9X_.cs-file наконец обнаружил, что могу сказать AutoMapper 9X_c#-language игнорировать все, а затем явно добавить 9X_.cs-file те, которые мне нужны.

// Create a map, store a reference to it in a local variable
var map = CreateMap();

// Ignore all members
map.ForAllMembers(opt => opt.Ignore());

// Add mapping for P1
map.ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));

// Add other mappings...
map.ForMember(dest => dest.P2, opt => opt.MapFrom( src => src.P2));
map.ForMember(dest => dest.P3, opt => opt.MapFrom( src => src.P3));
map.ForMember(dest => dest.P4, opt => opt.MapFrom( src => src.P4));

Вас простят за то, что 9X_c# вы думаете, что можете просто сделать это 9X_c-sharp (но не делайте этого, потому что это не 9X_c#-language будет компилироваться):

// This won't compile
CreateMap()
   .ForAllMembers(opt => opt.Ignore())
   .ForMember(dest => dest.P1, opt => opt.MapFrom( src => src.P1));

Причина, по которой 9X_csharp это не работает, заключается в том, что 9X_csharp метод ForAllMembers() не поддерживает плавный 9X_visual-c# стиль цепочки (по крайней мере, в текущей 9X_visual-c# версии 2.0).

Хорошая новость в том, что версия 9X_c#-language без цепочки действительно работает. Единственное 9X_c# предостережение, конечно, заключается в 9X_automapper том, что вам нужно явно указать AutoMapper, какие 9X_c-sharp элементы отображать. Я еще не нашел простого 9X_.cs-file способа сделать это в обоих направлениях, чтобы 9X_.cs-file вы по-прежнему могли использовать подразумеваемые 9X_c#.net сопоставления и игнорировать неработающие.

32
1

  • вы также можете использовать ForAllOtherMembers ...

Ответ #3

Ответ на вопрос: Как игнорировать всех участников назначения, кроме отображенных?

Чтобы избежать явного указания сопоставленных 9X_csharp свойств, можно использовать IgnoreAllNonExisting. Он игнорирует 9X_csharp любые свойства назначения, для которых нет 9X_c#-language сопоставленных свойств источника.

5
0

Ответ #4

Ответ на вопрос: Как игнорировать всех участников назначения, кроме отображенных?

Попробуйте использовать .ConvertUsing() в вашем случае, например

CreateMap()
 .ConvertUsing(converter=> new Target(){
P1 = converter.P1,
....
});

Итак, вы 9X_.cs-file можете описать все свойства, которые хотите 9X_c#-language иметь в своем объекте, остальные будут проигнорированы.

2
0

Ответ #5

Ответ на вопрос: Как игнорировать всех участников назначения, кроме отображенных?

Метод расширения, обеспечивающий свободный 9X_c# синтаксис для метода ForAllMembers:

public static IMappingExpression IgnoreAllMembers(
    this IMappingExpression expression
    )
{
    expression.ForAllMembers(opt => opt.Ignore());
    return expression;
}

Использование:

Вызов 9X_csharp IgnoreAllMembers должен быть перед вызовом 9X_.cs-file ForMember.

        CreateMap()
            .IgnoreAllMembers()
            .ForMember(m => m.LocationId, opt => opt.MapFrom(src => src.Id))
            ;

2
0