AutoMapper: Bỏ qua phần còn lại?


205

Có cách nào để yêu cầu AutoMapper bỏ qua tất cả các thuộc tính ngoại trừ các thuộc tính được ánh xạ rõ ràng không?

Tôi có các lớp DTO bên ngoài có khả năng thay đổi từ bên ngoài và tôi muốn tránh chỉ định rõ ràng từng thuộc tính bị bỏ qua, vì việc thêm các thuộc tính mới sẽ phá vỡ chức năng (gây ra ngoại lệ) khi cố gắng ánh xạ chúng vào các đối tượng của riêng tôi.


1
với ValueInjecter valueinjecter.codeplex.com/documentation, bạn tạo ValueInjections có alghorithm ánh xạ và ánh xạ giữa các thuộc tính cụ thể và họ không quan tâm đến phần còn lại của các thuộc tính
Omu

24
Đối với những người sử dụng Automapper> phiên bản 5, bỏ qua để xem chi tiết câu trả lời.ForAllOtherMembers(opts => opts.Ignore())
Jack Ukleja

@Schneider ".Ror ALLOtherMembers (opts => opts.Ignore ())" khác với phần mở rộng "IgnoreAllNonEx hiện" ở đây, sự khác biệt chính là nếu bạn không cấu hình rõ ràng thuộc tính, với ".ororOtherMembers (opts = )) "bạn sẽ không nhận được gì trên bản đồ. sử dụng "IgnoreAllNonEx hiện" mà không có thuộc tính cấu hình rõ ràng, bạn vẫn nhận được một số thuộc tính được ánh xạ (thuộc tính có cùng tên) với giá trị.
Rồng

Đúng. ForAllOtherMembers là câu trả lời. Các câu trả lời IgnoreUnmapped không làm bất cứ điều gì ngoại trừ khiến cấu hình hợp lệ-khẳng định vượt qua, vì dù sao các thành viên chưa được ánh xạ cũng bị bỏ qua.
N73k

Đáng lưu ý rằng khi làm điều này, bạn rõ ràng ẩn đi những thay đổi có khả năng liên quan hoặc quan trọng trong các lớp được ánh xạ. Có ánh xạ rõ ràng cho mọi thuộc tính sẽ khiến bạn bị kiểm tra hỏng mỗi khi lớp ánh xạ thay đổi, buộc bạn phải đánh giá đúng. (Cho rằng bạn có một bài kiểm tra thực hiện AssertConfigurationIsValid()cuộc gọi) Vì điều này, tôi coi "Bỏ qua phần còn lại" là một phản mẫu.
Arve Systad

Câu trả lời:


83

Đây là một phương pháp mở rộng mà tôi đã viết mà bỏ qua tất cả các thuộc tính không tồn tại trên đích. Không chắc nó có còn hữu ích không vì câu hỏi đã hơn hai năm tuổi, nhưng tôi gặp phải vấn đề tương tự khi phải thêm rất nhiều cuộc gọi Bỏ qua thủ công.

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> expression)
{
    var flags = BindingFlags.Public | BindingFlags.Instance;
    var sourceType = typeof (TSource);
    var destinationProperties = typeof (TDestination).GetProperties(flags);

    foreach (var property in destinationProperties)
    {
        if (sourceType.GetProperty(property.Name, flags) == null)
        {
            expression.ForMember(property.Name, opt => opt.Ignore());
        }
    }
    return expression;
}

Sử dụng:

Mapper.CreateMap<SourceType, DestinationType>()
                .IgnoreAllNonExisting();

CẬP NHẬT : Rõ ràng điều này không hoạt động chính xác nếu bạn có ánh xạ tùy chỉnh vì nó ghi đè lên chúng. Tôi đoán nó vẫn có thể hoạt động nếu gọi Ignore ALLNonEx hiện trước và sau đó là ánh xạ tùy chỉnh sau.

schdr có một giải pháp (như một câu trả lời cho câu hỏi này) sử dụng Mapper.GetAllTypeMaps()để tìm ra các thuộc tính nào không được ánh xạ và tự động bỏ qua chúng. Có vẻ như một giải pháp mạnh mẽ hơn đối với tôi.


Tôi đã không sử dụng AutoMapper một thời gian, nhưng tôi sẽ chấp nhận câu trả lời của bạn nếu nó hoạt động cho bạn :).
Igor Brejc

2
Cảm ơn!! Tôi thấy điều này rất tiện dụng. Bỏ qua các thuộc tính riêng lẻ đã đánh bại mục đích sử dụng automapper trong tình huống của tôi.
Daniel Robinson

Xem câu trả lời tiếp theo cho câu hỏi không có vấn đề ghi đè
Jason Coyne

3
Phương pháp này nên có trên mã gốc autoMapper! Rất tuyệt cảm ơn bạn!
Felipe Oriani

2
FYI, chính Jimmy (nhà văn của AutoMapper) đã bình luận bên dưới rằng câu trả lời của @ nazim là chính xác cho phiên bản 5+
Worthy7

244

Từ những gì tôi hiểu câu hỏi là có các trường trên đích không có trường được ánh xạ trong nguồn, đó là lý do tại sao bạn đang tìm cách bỏ qua các trường đích không được ánh xạ đó.

Thay vì thực hiện và sử dụng các phương thức mở rộng này, bạn có thể chỉ cần sử dụng

Mapper.CreateMap<sourceModel, destinationModel>(MemberList.Source);  

Bây giờ trình tự động hóa biết rằng nó chỉ cần xác thực rằng tất cả các trường nguồn được ánh xạ chứ không phải theo cách khác.

Bạn cũng có thể dùng:

Mapper.CreateMap<sourceModel, destinationModel>(MemberList.Destination);  

10
Câu trả lời này nên có nhiều upvote hơn, thậm chí có thể được đánh dấu là câu trả lời. Nó giải quyết vấn đề của tôi và tương tự MemberList.Destinationsẽ giải quyết vấn đề ops.
Tedd Hansen

1
Sẽ không hoạt động nếu bạn muốn bỏ qua một vài thuộc tính trên cả nguồn và đích :)
RealWillyWoka

62
Đối với bất kỳ ai đến sau, ĐÂY LÀ TRẢ LỜI ĐÚNG ĐỐI VỚI 5.0
Jimmy Bogard

3
Trông có vẻ tiện lợi nhưng không hiệu quả với tôi .. tôi đã thử Nguồn và Đích, nhưng nó vẫn phàn nàn về cùng một đối tượng thuộc tính thiếu bản đồ
Sonic Soul

1
Sử dụng 6.0.2 và đây không phải là thời gian làm việc. Bất kỳ thuộc tính nào không được ánh xạ từ đích đến nguồn, ghi đè lên các thuộc tính trong nguồn bằng null và 0. Cộng với mã không làm rõ những gì bạn đang làm, đặc biệt là nếu bạn đang làm việc trong một nhóm. Đó là lý do tại sao tôi không thích mã này và tại sao tôi thích các từ được lựa chọn như câu trả lời được đề xuất "Ignore ALLNonEx hiện"
sksallaj

222

Tôi đã cập nhật tiện ích mở rộng của Can Gencer để không ghi đè lên bất kỳ bản đồ hiện có nào.

public static IMappingExpression<TSource, TDestination> 
    IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var sourceType = typeof (TSource);
    var destinationType = typeof (TDestination);
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType));
    foreach (var property in existingMaps.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

Sử dụng:

Mapper.CreateMap<SourceType, DestinationType>()
                .ForMember(prop => x.Property, opt => opt.MapFrom(src => src.OtherProperty))
                .IgnoreAllNonExisting();

4
+1, Cảm ơn bạn đã đăng giải pháp này. Tôi đã mất hàng giờ để tìm ra lỗi lạ khi tôi sử dụng giải pháp trong goo.gl/rG7SL , cho đến khi tôi vấp phải bài đăng này một lần nữa.
Nordin

3
Tôi khuyên bạn nên dùng phương pháp của Yohanb dưới đây. Có một số trường hợp góc mà điều này không làm việc cho nó xuất hiện.
Jon Barker

3
Điều này có thể được thực hiện trong AutoMapper 4.2 không? (The Mapper.GetAllTypeMaps()deprecated)
mrmashal

14
Đối với phiên bản AutoMapper 5+ chỉ cần thay thế Mapper.GetAllTypeMaps()bằng Mapper.Configuration.GetAllTypeMaps(). Dưới đây là tài liệu tham khảo github.com/AutoMapper/AutoMapper/issues/1252
Sergey G.

5
Đối với những người mới đọc này. Câu trả lời này dành cho AutoMapper 2 và tại thời điểm viết nhận xét này, chúng tôi đang ở phiên bản 6. Đây là một bản hack và một cách sạch sẽ hơn nhiều là sử dụng enList của ListList. Xem vấn đề Github 1839 và một giải pháp tốt hơn. github.com/AutoMapper/AutoMapper/issues/1839 Ví dụ: stackoverflow.com/a/31182390/3850405
Ogglas

83

Tôi đã có thể làm điều này theo cách sau:

Mapper.CreateMap<SourceType, DestinationType>().ForAllMembers(opt => opt.Ignore());
Mapper.CreateMap<SourceType, DestinationType>().ForMember(/*Do explicit mapping 1 here*/);
Mapper.CreateMap<SourceType, DestinationType>().ForMember(/*Do explicit mapping 2 here*/);
...

Lưu ý: Tôi đang sử dụng AutoMapper v.2.0.


4
cảm ơn bạn rất nhiều! Nó hoạt động như một say mê. Tôi đã cố gắng đầu tiên để xâu chuỗi các cuộc gọi nhưng ForAllMembers chỉ trả về khoảng trống :(. Rõ ràng là một Ignore ALL trước đó có thể được sửa đổi sau.
SeriousM

5
Tôi cũng không thích cách này .. nếu bạn có 50 thành viên và bạn muốn bỏ qua 25 .. thì điểm của máy tự động là gì nếu bạn vẫn phải bỏ qua 25 thành viên. Nếu tên trùng khớp và có các thuộc tính không khớp .. tại sao không làm rõ để nói với máy tự động không khớp với các thuộc tính chưa được ánh xạ và bằng cách chuyển tất cả các lần gõ?
sksallaj

71

Phiên bản 5.0.0-beta-1 của AutoMapper giới thiệu ForAllOtherMembersphương thức tiện ích mở rộng để bây giờ bạn có thể thực hiện việc này:

CreateMap<Source, Destination>()
    .ForMember(d => d.Text, o => o.MapFrom(s => s.Name))
    .ForMember(d => d.Value, o => o.MapFrom(s => s.Id))
    .ForAllOtherMembers(opts => opts.Ignore());

Xin lưu ý rằng có một lợi thế để lập bản đồ rõ ràng cho từng thuộc tính vì bạn sẽ không bao giờ gặp phải các vấn đề về ánh xạ thất bại phát sinh khi bạn quên lập bản đồ một thuộc tính.

Có lẽ trong trường hợp của bạn, có thể là khôn ngoan khi bỏ qua tất cả các thành viên khác và thêm một TODOđể quay lại và làm cho những điều này rõ ràng sau khi tần suất thay đổi của lớp này lắng xuống.


3
Điều này thật tuyệt vời cho đến phiên bản 5. Hãy xem có bao nhiêu câu hỏi và câu trả lời cố gắng cho câu hỏi này ... có gì đó không ổn với quản trị của Automapper tôi tự hỏi?
Jack Ukleja

Cảm ơn bạn vì điều này, tôi đã mất một lúc để cuộn xuống nhưng cái này, nhưng nó hoạt động hoàn hảo.
cobolstinks

2
Bạn thậm chí có thể đặt dòng ForAllOtherMembers trước và mọi thứ sẽ hoạt động như nhau, điều này tốt nếu bạn có một số loại cấu hình lớp cơ sở.
N73k

Đây là cách tiếp cận ưa thích. Tự hỏi nếu OP có thể thay đổi câu trả lời được chấp nhận?
Chase Florell

1
Có tương đương để bỏ qua các thuộc tính trong đối tượng nguồn? Một cái gì đó như thế ForAllOtherSourceMembersnào?
SuperJMN

44

Kể từ AutoMapper 5.0, thuộc .TypeMaptính trên IMappingExpressionđã biến mất, nghĩa là giải pháp 4.2 không còn hoạt động. Tôi đã tạo một giải pháp sử dụng chức năng ban đầu nhưng với một cú pháp khác:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Src, Dest>();
    cfg.IgnoreUnmapped();        // Ignores unmapped properties on all maps
    cfg.IgnoreUnmapped<Src, Dest>();  // Ignores unmapped properties on specific map
});

// or add  inside a profile
public class MyProfile : Profile
{
   this.IgnoreUnmapped();
   CreateMap<MyType1, MyType2>();
}

Thực hiện:

public static class MapperExtensions
{
    private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr)
    {
        foreach (string propName in map.GetUnmappedPropertyNames())
        {
            if (map.SourceType.GetProperty(propName) != null)
            {
                expr.ForSourceMember(propName, opt => opt.Ignore());
            }
            if (map.DestinationType.GetProperty(propName) != null)
            {
                expr.ForMember(propName, opt => opt.Ignore());
            }
        }
    }

    public static void IgnoreUnmapped(this IProfileExpression profile)
    {
        profile.ForAllMaps(IgnoreUnmappedProperties);
    }

    public static void IgnoreUnmapped(this IProfileExpression profile, Func<TypeMap, bool> filter)
    {
        profile.ForAllMaps((map, expr) =>
        {
            if (filter(map))
            {
                IgnoreUnmappedProperties(map, expr);
            }
        });
    }

    public static void IgnoreUnmapped(this IProfileExpression profile, Type src, Type dest)
    {
        profile.IgnoreUnmapped((TypeMap map) => map.SourceType == src && map.DestinationType == dest);
    }

    public static void IgnoreUnmapped<TSrc, TDest>(this IProfileExpression profile)
    {
        profile.IgnoreUnmapped(typeof(TSrc), typeof(TDest));
    }
}

3
Làm thế nào bạn sẽ sử dụng điều này trong một CreateMap<TSource,TDest>()biểu thức xích trong một Profile?
jmoerdyk

2
Cảm ơn vì điều đó. Phương thức GetUnmappedPropertyNames trả về tất cả các tên thuộc tính chưa được ánh xạ, trên cả nguồn và đích, dường như bị phá vỡ trên bản đồ ngược, vì vậy tôi phải thực hiện một thay đổi nhỏ đối với IgnoreUnmapped để kiểm tra xem thuộc tính chưa được khai thác có trên nguồn hoặc đích không phù hợp. Đây là một câu đố thể hiện vấn đề và bản cập nhật: dotnetfiddle.net/vkRGJv
Mun

1
Tôi đã cập nhật câu trả lời của mình để bao gồm các phát hiện của bạn - Tôi không sử dụng ánh xạ nguồn nên đã không bắt gặp điều này! Cảm ơn.
Richard

1
Điều này không hoạt động trên PCL mà không có phản ánh có sẵn, GetProperty (propName) không tồn tại.
George Taskos

Tôi không thấy làm thế nào đây là một giải pháp cho câu hỏi, hoặc làm thế nào điều này thậm chí làm bất cứ điều gì. Các thuộc tính chưa được ánh xạ sẽ bị bỏ qua - bởi vì chúng chưa được ánh xạ . Người đăng cho biết "làm thế nào để bạn bỏ qua đạo cụ trừ khi chúng được ánh xạ rõ ràng ". Điều đó có nghĩa là nếu tôi có Src.MyProp và Dest.MyProp, ánh xạ đó sẽ bị bỏ qua trừ khi có một cuộc gọi rõ ràng tới MapFrom & ForMember cho MyProp. Vì vậy, ánh xạ mặc định cần phải được bỏ qua. Điều duy nhất mà giải pháp này thực hiện là làm cho điều xác nhận cấu hình hợp lệ vượt qua - điều mà bạn không cần dù sao để ánh xạ hoạt động.
N73k

17

Đã có một vài năm kể từ khi câu hỏi được đặt ra, nhưng phương pháp mở rộng này có vẻ sạch hơn đối với tôi, sử dụng phiên bản hiện tại của AutoMapper (3.2.1):

public static IMappingExpression<TSource, TDestination> IgnoreUnmappedProperties<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    var typeMap = Mapper.FindTypeMapFor<TSource, TDestination>();
    if (typeMap != null)
    {
        foreach (var unmappedPropertyName in typeMap.GetUnmappedPropertyNames())
        {
            expression.ForMember(unmappedPropertyName, opt => opt.Ignore());
        }
    }

    return expression;
}

16

Đối với những người đang sử dụng API không tĩnh trong phiên bản 4.2.0 trở lên, có thể sử dụng phương pháp tiện ích mở rộng sau (được tìm thấy ở đây trong AutoMapperExtensionslớp):

// from http://stackoverflow.com/questions/954480/automapper-ignore-the-rest/6474397#6474397
public static IMappingExpression IgnoreAllNonExisting(this IMappingExpression expression)
{
    foreach(var property in expression.TypeMap.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

Điều quan trọng ở đây là một khi API tĩnh bị loại bỏ, mã như Mapper.FindTypeMapForsẽ không còn hoạt động, do đó sử dụng expression.TypeMaptrường.


7
Kể từ 5.0, expression.TypeMapkhông còn có sẵn. Đây là giải pháp của tôi cho 5.0
Richard

Tôi đã phải sử dụng public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)để khắc phục các vấn đề loại.
Nick M

16

Đối với Automapper 5.0 để bỏ qua tất cả các thuộc tính chưa được ánh xạ, bạn chỉ cần đặt

.Tất cảOtherMembers (x => x.Ignore ());

vào cuối hồ sơ của bạn.

Ví dụ:

internal class AccountInfoEntityToAccountDtoProfile : Profile
{
    public AccountInfoEntityToAccountDtoProfile()
    {
        CreateMap<AccountInfoEntity, AccountDto>()
           .ForMember(d => d.Id, e => e.MapFrom(s => s.BankAcctInfo.BankAcctFrom.AcctId))
           .ForAllOtherMembers(x=>x.Ignore());
    }
}

Trong trường hợp này, chỉ có trường Id cho đối tượng đầu ra sẽ được giải quyết, tất cả các trường khác sẽ bị bỏ qua. Hoạt động như một bùa mê, dường như chúng ta không cần bất kỳ tiện ích mở rộng khó khăn nào nữa!


10

Tôi đã cập nhật câu trả lời của Robert Schroeder cho AutoMapper 4.2. Với các cấu hình ánh xạ không tĩnh, chúng tôi không thể sử dụng Mapper.GetAllTypeMaps(), nhưng expressioncó tham chiếu đến yêu cầu TypeMap:

public static IMappingExpression<TSource, TDestination> 
    IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
{
    foreach (var property in expression.TypeMap.GetUnmappedPropertyNames())
    {
        expression.ForMember(property, opt => opt.Ignore());
    }
    return expression;
}

Không hoạt động trong AutoMapper 5.0. Thuộc tính .TypeMap trên IMickingExpression không khả dụng. Đối với phiên bản 5. +, hãy xem các phần mở rộng trong câu trả lời của Richard
Michael Freidgeim

Hoạt động với AM 4.2
Leszek P

8

Làm thế nào bạn muốn xác định rằng các thành viên nhất định bị bỏ qua? Có một quy ước, hoặc lớp cơ sở, hoặc thuộc tính bạn muốn áp dụng? Khi bạn tham gia vào việc xác định rõ ràng tất cả các ánh xạ, tôi không chắc bạn sẽ nhận được giá trị gì từ AutoMapper.


Jimmy, bạn có một điểm về nhân chứng. Về cách thức để đạt được điều này theo cách thanh lịch nhất: các lớp cơ sở và thuộc tính sẽ không hoạt động trong tình huống này, vì các lớp mục tiêu không thực sự nằm trong tầm kiểm soát của tôi - chúng được tự động tạo ra từ hợp đồng dữ liệu XSD, vì vậy một người sẽ có để tự chỉnh sửa mã này sau mỗi chu kỳ thế hệ. Tôi đoán giải pháp phụ thuộc vào một trường hợp cụ thể. Có lẽ một giao diện trôi chảy tương tự như một lâu đài Windsor cung cấp cho việc chọn thành phần nào để đăng ký trong container có thể là một giải pháp?
Igor Brejc

Ah điều đó có ý nghĩa hơn bây giờ. Đó là một tính năng thú vị, tôi sẽ xem xét tính năng đó trong khung thời gian 2.1.
Jimmy Bogard

2
Làm thế nào về việc chỉ có một giá trị có thể định cấu hình trong đó bạn có thể "bỏ qua" tất cả các trường không tồn tại.
Ricardo Sanchez

6
Đây không phải là một câu trả lời cho câu hỏi.
dùng2864740

Xin chào, bạn là tác giả, đúng không? Tôi muốn có thể bỏ qua tất cả các thuộc tính không tồn tại là một hành vi mặc định (có thể được điều khiển bởi một cờ). Ngoài ra, tôi có một lỗi lạ từ AutoMapper tôi không thể tìm ra. Nó không cung cấp cho tôi bất kỳ chi tiết cụ thể.
Naomi

7

Đây có vẻ là một câu hỏi cũ nhưng nghĩ rằng tôi sẽ đăng câu trả lời của mình cho bất cứ ai khác trông giống như tôi.

Tôi sử dụng ConstructUsing, trình khởi tạo đối tượng được kết hợp với ForAllMembers bỏ qua, vd

    Mapper.CreateMap<Source, Target>()
        .ConstructUsing(
            f =>
                new Target
                    {
                        PropVal1 = f.PropVal1,
                        PropObj2 = Map<PropObj2Class>(f.PropObj2),
                        PropVal4 = f.PropVal4
                    })
        .ForAllMembers(a => a.Ignore());

1

Thông tin duy nhất về việc bỏ qua nhiều thành viên là chủ đề này - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Tôi nghĩ rằng bạn có thể sử dụng thủ thuật được sử dụng trong Cung cấpCommonBaseClassConfiguration để bỏ qua các thuộc tính phổ biến cho các lớp tương tự.
Và không có thông tin về chức năng "Bỏ qua phần còn lại". Tôi đã xem mã trước đây và dường như sẽ rất khó để thêm chức năng đó. Ngoài ra, bạn có thể thử sử dụng một số thuộc tính và đánh dấu với các thuộc tính bị bỏ qua và thêm một số mã chung / chung để bỏ qua tất cả các thuộc tính được đánh dấu.


1
Có lẽ một cách là sử dụng phương thức For ALLMembers và triển khai IMemberConfigurationExpression của riêng tôi, nhận một chuỗi chứa tên thuộc tính của các thuộc tính không nên bỏ qua, sau đó đi qua phần còn lại của chúng và gọi Ignore (). Chỉ là một ý tưởng, tôi không chắc nó sẽ hoạt động.
Igor Brejc

Vâng, điều này cũng có thể hoạt động, nhưng phương pháp này khó hơn so với sử dụng các thuộc tính nhưng nó mang lại sự linh hoạt hơn. Thật đáng tiếc khi không có viên đạn bạc :(.
zihotki

1

Tôi biết đây là một câu hỏi cũ, nhưng @jmoerdyk trong câu hỏi của bạn:

Làm thế nào bạn sẽ sử dụng điều này trong một biểu thức CreatMap () được xâu chuỗi trong Hồ sơ?

bạn có thể sử dụng câu trả lời như thế này trong ctor Profile

this.IgnoreUnmapped();
CreateMap<TSource, Tdestination>(MemberList.Destination)
.ForMember(dest => dest.SomeProp, opt => opt.MapFrom(src => src.OtherProp));

0

Bạn có thể sử dụng ForAllMembers, hơn ghi đè chỉ cần thiết như thế này

public static IMappingExpression<TSource, TDest> IgnoreAll<TSource, TDest>(this IMappingExpression<TSource, TDest> expression)
        {
            expression.ForAllMembers(opt => opt.Ignore());
            return expression;
        }

Hãy cẩn thận, nó sẽ bỏ qua tất cả và nếu bạn không thêm ánh xạ tùy chỉnh, chúng sẽ bị bỏ qua và sẽ không hoạt động

Ngoài ra, tôi muốn nói, nếu bạn có bài kiểm tra đơn vị cho AutoMapper. Và bạn kiểm tra rằng tất cả các mô hình với tất cả các thuộc tính được ánh xạ chính xác, bạn không nên sử dụng phương thức mở rộng như vậy

bạn nên viết bỏ qua một cách rõ ràng


-1

Giải pháp hiện tại (phiên bản 9) để bỏ qua các thuộc tính không tồn tại trong loại đích là tạo ánh xạ lật và đảo ngược nó:

var config = new MapperConfiguration(cfg => {
  cfg.CreateMap<TheActualDestinationType, TheActualSourceType>().ReverseMap();
});

-2

Trong phiên bản 3.3.1, bạn chỉ cần sử dụng IgnoreAllPropertiesWithAnInaccessibleSetter()hoặc IgnoreAllSourcePropertiesWithAnInaccessibleSetter()phương thức.


6
Điều này không hoạt động theo câu hỏi của người gửi ban đầu. Các phương thức này chỉ bỏ qua các thuộc tính được bảo vệ hoặc riêng tư, không phải các thuộc tính bị thiếu từ nguồn mà có trong loại đích.
Dan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.