AutoMapper: "Den Rest ignorieren"?

205

Gibt es eine Möglichkeit, AutoMapper anzuweisen, alle Eigenschaften außer denen, die explizit zugeordnet sind, zu ignorieren?

Ich habe externe DTO-Klassen, die sich wahrscheinlich von außen ändern, und ich möchte vermeiden, dass jede Eigenschaft explizit ignoriert wird, da das Hinzufügen neuer Eigenschaften die Funktionalität beeinträchtigt (Ausnahmen verursacht), wenn versucht wird, sie meinen eigenen Objekten zuzuordnen.

Igor Brejc
quelle
1
Mit dem ValueInjecter valueeinjecter.codeplex.com/documentation erstellen Sie ValueInjections, deren Zuordnungsalgorithmus und Zuordnung zwischen bestimmten Eigenschaften bestehen, und die sich nicht um den Rest der Eigenschaften kümmern
Omu
24
Für diejenigen, die Automapper> Version 5 verwenden, überspringen Sie nach unten, um detaillierte Antworten zu sehen.ForAllOtherMembers(opts => opts.Ignore())
Jack Ukleja
@Schneider ".ForAllOtherMembers (opts => opts.Ignore ())" unterscheidet sich hier von der Erweiterung "IgnoreAllNonExisting". Der Hauptunterschied besteht darin, dass Sie die Eigenschaft nicht explizit mit ".ForAllOtherMembers (opts => opts.Ignore ( )) "Sie erhalten nichts zugeordnet. Verwenden Sie "IgnoreAllNonExisting" ohne explizite Konfigurationseigenschaft. Sie erhalten weiterhin einige Eigenschaften (Eigenschaften mit demselben Namen) mit Wert.
Dragon
Ja. Die ForAllOtherMembers sind die Antwort. Die IgnoreUnmapped-Antworten bewirken nichts anderes als das Bestehen der config-valid-assert, da nicht zugeordnete Mitglieder sowieso ignoriert werden.
N73k
Beachten Sie, dass Sie dabei potenziell relevante oder wichtige Änderungen in den zugeordneten Klassen explizit verbergen. Wenn Sie für jede Eigenschaft explizite Zuordnungen haben, wird bei jeder Änderung der zugeordneten Klasse ein fehlerhafter Test durchgeführt, sodass Sie gezwungen sind, diese ordnungsgemäß auszuwerten. (Vorausgesetzt, Sie haben einen Test, der den AssertConfigurationIsValid()Anruf ausführt.) Aus diesem Grund halte ich "Ignoriere den Rest" für ein Antimuster.
Arve Systad

Antworten:

83

Dies ist eine Erweiterungsmethode, die ich geschrieben habe und die alle nicht vorhandenen Eigenschaften des Ziels ignoriert. Ich bin mir nicht sicher, ob es noch nützlich sein wird, da die Frage älter als zwei Jahre ist, aber ich bin auf dasselbe Problem gestoßen, das viele manuelle Ignorieraufrufe hinzufügen musste.

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;
}

Verwendung:

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

UPDATE : Anscheinend funktioniert dies nicht richtig, wenn Sie benutzerdefinierte Zuordnungen haben, da diese überschrieben werden. Ich denke, es könnte immer noch funktionieren, wenn Sie zuerst IgnoreAllNonExisting und später die benutzerdefinierten Zuordnungen aufrufen.

schdr hat eine Lösung (als Antwort auf diese Frage), mit Mapper.GetAllTypeMaps()der herausgefunden wird, welche Eigenschaften nicht zugeordnet sind, und diese automatisch ignoriert wird. Scheint mir eine robustere Lösung zu sein.

Kann Gencer
quelle
Ich habe AutoMapper seit einiger Zeit nicht mehr verwendet, aber ich werde Ihre Antwort akzeptieren, wenn es für Sie funktioniert :).
Igor Brejc
2
Vielen Dank!! Ich fand das sehr praktisch. Das individuelle Ignorieren von Eigenschaften hat den Zweck der Verwendung von Automapper in meiner Situation zunichte gemacht.
Daniel Robinson
Siehe die nächste Antwort für eine, die nicht das Überschreibproblem hat
Jason Coyne
3
Diese Methode sollte im nativen autoMapper-Code enthalten sein! Sehr Schön. Danke!
Felipe Oriani
2
Zu Ihrer Information, Jimmy selbst (Autor von AutoMapper) hat unten kommentiert, dass die Antwort von @ nazim für Version 5+ korrekt ist
Worthy7
244

Soweit ich verstanden habe, war die Frage, dass es Felder am Ziel gibt, die kein zugeordnetes Feld in der Quelle haben. Deshalb suchen Sie nach Möglichkeiten, diese nicht zugeordneten Zielfelder zu ignorieren.

Anstatt diese Erweiterungsmethode zu implementieren und zu verwenden, können Sie sie einfach verwenden

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

Jetzt weiß der Automapper, dass er nur überprüfen muss, ob alle Quellfelder zugeordnet sind, aber nicht umgekehrt.

Sie können auch verwenden:

Mapper.CreateMap<sourceModel, destinationModel>(MemberList.Destination);  
Nazim Hafeez
quelle
10
Diese Antwort sollte mehr positive Stimmen haben, vielleicht sogar als Antwort markiert werden. Es löste mein Problem und MemberList.Destinationwürde in ähnlicher Weise das Ops-Problem lösen.
Tedd Hansen
1
Es wird nicht funktionieren, wenn Sie einige Eigenschaften auf Quelle und Ziel ignorieren möchten :)
RealWillyWoka
62
Für alle, die später kommen, ist dies die richtige Antwort für 5.0
Jimmy Bogard
3
sieht gut aus, hat aber bei mir nicht funktioniert. Ich habe Source and Destination ausprobiert, aber es beschwert sich immer wieder über dasselbe Objekt, bei dem eine Karte fehlt
Sonic Soul
1
Verwenden Sie 6.0.2 und dies funktioniert nicht. Alle Eigenschaften, die nicht vom Ziel zur Quelle zugeordnet sind, überschreiben die Eigenschaften in der Quelle mit Nullen und Nullen. Außerdem macht der Code nicht klar, was Sie tun, insbesondere wenn Sie in einem Team arbeiten. Aus diesem Grund mag ich diesen Code nicht und bevorzuge ausgewählte Wörter wie die vorgeschlagene Antwort "IgnoreAllNonExisting"
sksallaj
222

Ich habe die Erweiterung von Can Gencer aktualisiert, um keine vorhandenen Karten zu überschreiben.

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;
}

Verwendung:

Mapper.CreateMap<SourceType, DestinationType>()
                .ForMember(prop => x.Property, opt => opt.MapFrom(src => src.OtherProperty))
                .IgnoreAllNonExisting();
Robert Schroeder
quelle
4
+1, Vielen Dank, dass Sie diese Lösung veröffentlicht haben. Es hat Stunden gedauert , bis ich einen seltsamen Fehler gefunden habe, als ich die Lösung in goo.gl/rG7SL verwendet habe , bis ich wieder auf diesen Beitrag gestoßen bin.
Nordin
3
Ich empfehle Yohanbs Methode weiter unten. Es gibt einige Eckfälle, in denen dies nicht funktioniert.
Jon Barker
3
Kann dies in AutoMapper 4.2 durchgeführt werden? (Das Mapper.GetAllTypeMaps()ist veraltet)
Mrmashal
14
Für AutoMapper 5+ Version ersetzen Sie einfach Mapper.GetAllTypeMaps()mit Mapper.Configuration.GetAllTypeMaps(). Hier ist die Referenz github.com/AutoMapper/AutoMapper/issues/1252
Sergey G.
5
Für neue Leute, die dies lesen. Diese Antwort ist für AutoMapper 2 und zum Zeitpunkt des Schreibens dieses Kommentars befinden wir uns in Version 6. Dies ist ein Hack und eine viel sauberere Methode ist die Verwendung der MemberList-Enumeration. Siehe Github-Ausgabe 1839 und eine bessere Lösung. github.com/AutoMapper/AutoMapper/issues/1839 Beispiel: stackoverflow.com/a/31182390/3850405
Ogglas
83

Ich konnte dies folgendermaßen tun:

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*/);
...

Hinweis: Ich verwende AutoMapper v.2.0.

Yohanb
quelle
4
ich danke dir sehr! es wirkt wie ein Zauber. Ich habe zuerst versucht, die Aufrufe zu verketten, aber ForAllMembers geben nur void zurück :(. Es war nicht offensichtlich, dass ein vorhergehender IgnoreAll später geändert werden kann.
SeriousM
5
Ich mag diesen Weg auch nicht. Wenn Sie 50 Mitglieder haben und 25 ignorieren möchten, was bringt der Automapper dann, wenn Sie noch 25 Mitglieder ignorieren müssen? Wenn Namen übereinstimmen und es Eigenschaften gibt, die nicht übereinstimmen. Warum nicht klarstellen, dass der Automapper bei nicht zugeordneten Eigenschaften nicht übereinstimmen soll, und alle Eingaben übergeben?
Sksallaj
71

In Version 5.0.0-beta-1 von AutoMapper wird die ForAllOtherMembersErweiterungsmethode eingeführt, sodass Sie dies jetzt tun können:

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());

Beachten Sie, dass die explizite Zuordnung jeder Eigenschaft von Vorteil ist, da Sie niemals Probleme mit der stillschweigenden Zuordnung erhalten, die auftreten, wenn Sie vergessen, eine Eigenschaft zuzuordnen.

In Ihrem Fall ist es möglicherweise ratsam, alle anderen Mitglieder zu ignorieren und ein hinzuzufügen TODO, um zurückzukehren und diese explizit zu machen, nachdem sich die Häufigkeit der Änderungen an dieser Klasse beruhigt hat.

ajbeaven
quelle
3
Erstaunlich, dass dies bis Version 5 gedauert hat. Sehen Sie, wie viele Up-Votes und versuchte Antworten auf diese Frage ... etwas, das mit Automappers Governance nicht stimmt, frage ich mich?
Jack Ukleja
Vielen Dank dafür, ich habe eine Weile gebraucht, um nach unten zu scrollen, aber das, aber es funktioniert perfekt.
Cobolstinks
2
Sie können sogar die ForAllOtherMembers-Zeile an die erste Stelle setzen, und die Dinge funktionieren genauso. Dies ist gut, wenn Sie eine Basisklassenkonfiguration haben.
N73k
Dies ist jetzt der bevorzugte Ansatz. Frage mich, ob das OP die akzeptierte Antwort ändern könnte?
Chase Florell
1
Gibt es ein Äquivalent zum Ignorieren der Eigenschaften im Quellobjekt? So etwas wie ForAllOtherSourceMembers?
SuperJMN
44

Ab AutoMapper 5.0 ist die .TypeMapEigenschaft on IMappingExpressionweg, was bedeutet, dass die 4.2-Lösung nicht mehr funktioniert. Ich habe eine Lösung erstellt, die die ursprüngliche Funktionalität verwendet, jedoch eine andere Syntax aufweist:

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>();
}

Implementierung:

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));
    }
}
Richard
quelle
3
Wie würden Sie dies in einem verketteten CreateMap<TSource,TDest>()Ausdruck in einem verwenden Profile?
jmoerdyk
2
Danke dafür. Die GetUnmappedPropertyNames-Methode gibt alle nicht zugeordneten Eigenschaftsnamen sowohl für die Quelle als auch für das Ziel zurück, die auf einer umgekehrten Zuordnung anscheinend unterbrochen sind. Daher musste ich eine kleine Änderung an IgnoreUnmapped vornehmen, um zu überprüfen, ob sich die nicht zugeordnete Eigenschaft in der Quelle oder dem Ziel befand, und zu ignorieren entsprechend. Hier ist eine Geige, die das Problem und das Update demonstriert: dotnetfiddle.net/vkRGJv
Mun
1
Ich habe meine Antwort aktualisiert, um Ihre Ergebnisse aufzunehmen. Ich verwende keine Quellzuordnungen, bin also nicht darauf gestoßen! Vielen Dank.
Richard
1
Dies funktioniert nicht auf PCL ohne verfügbare Reflektion, GetProperty (propName) existiert nicht.
George Taskos
Ich sehe nicht ein, wie dies eine Lösung für die Frage ist oder wie dies überhaupt etwas bewirkt. Nicht zugeordnete Eigenschaften werden bereits ignoriert werden - denn sie sind nicht zugeordnet . Auf dem Poster stand "Wie ignorierst du Requisiten, wenn sie nicht explizit zugeordnet sind ?". Das heißt, wenn ich Src.MyProp und Dest.MyProp habe, sollte diese Zuordnung ignoriert werden, es sei denn, es gab einen expliziten Aufruf von MapFrom & ForMember für MyProp. Daher muss die Standardzuordnung ignoriert werden. Das einzige, was diese Lösung bewirkt, ist, dass die Datei config-valid-assert übergeben wird - was Sie ohnehin nicht benötigen, damit das Mapping funktioniert.
N73k
17

Es ist einige Jahre her, seit die Frage gestellt wurde, aber diese Erweiterungsmethode scheint mir mit der aktuellen Version von AutoMapper (3.2.1) sauberer zu sein:

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;
}
Iravanchi
quelle
16

Für diejenigen, die die nicht statische API in Version 4.2.0 und höher verwenden, kann die folgende Erweiterungsmethode ( hier in der AutoMapperExtensionsKlasse zu finden) verwendet werden:

// 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;
}

Das Wichtigste dabei ist, dass nach dem Entfernen der statischen API Code wie Mapper.FindTypeMapFordieser nicht mehr funktioniert, daher die Verwendung des expression.TypeMapFelds.

nick_w
quelle
7
Ab 5.0 expression.TypeMapist nicht mehr verfügbar. Hier ist meine Lösung für 5.0
Richard
Ich musste verwenden, public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)um Typprobleme zu beheben.
Nick M
16

Für Automapper 5.0, um alle nicht zugeordneten Eigenschaften zu überspringen, müssen Sie nur setzen

.ForAllOtherMembers (x => x.Ignore ());

am Ende Ihres Profils.

Beispielsweise:

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());
    }
}

In diesem Fall wird nur das ID-Feld für das Ausgabeobjekt aufgelöst, alle anderen werden übersprungen. Funktioniert wie ein Zauber, anscheinend brauchen wir keine kniffligen Erweiterungen mehr!

Framerelay
quelle
10

Ich habe die Antwort von Robert Schroeder für AutoMapper 4.2 aktualisiert. Bei nicht statischen Mapper-Konfigurationen können wir keine verwenden Mapper.GetAllTypeMaps(), aber das expressionhat einen Verweis auf das Erforderliche 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;
}
mrmashal
quelle
Funktioniert nicht in AutoMapper 5.0. Die .TypeMap-Eigenschaft in IMappingExpression ist nicht verfügbar. Für 5. + Version siehe Erweiterungen in Richards Antwort
Michael Freidgeim
Arbeitet mit AM 4.2
Leszek P
8

Wie möchten Sie festlegen, dass bestimmte Mitglieder ignoriert werden? Gibt es eine Konvention, eine Basisklasse oder ein Attribut, das Sie anwenden möchten? Wenn Sie erst einmal alle Zuordnungen explizit angegeben haben, bin ich mir nicht sicher, welchen Wert AutoMapper für Sie haben würde.

Jimmy Bogard
quelle
Jimmy, du hast einen Punkt über explizite Aussagen. Wie dies auf eleganteste Weise erreicht werden kann: Basisklassen und Attribute würden in dieser Situation nicht funktionieren, da die Zielklassen nicht wirklich unter meiner Kontrolle stehen - sie werden automatisch aus dem XSD-Datenvertrag generiert, so hätte man es getan um diesen Code nach jedem Generierungszyklus manuell zu bearbeiten. Ich denke, die Lösung hängt von einem konkreten Fall ab. Vielleicht könnte eine fließende Schnittstelle ähnlich der von Windsor Castle zur Auswahl der im Container zu registrierenden Komponenten eine Lösung sein?
Igor Brejc
Ah, das macht jetzt mehr Sinn. Das ist eine interessante Funktion, die ich mir im 2.1-Zeitrahmen ansehen werde.
Jimmy Bogard
2
Wie wäre es nur mit einem konfigurierbaren Wert, bei dem Sie alle nicht vorhandenen Felder "ignorieren" können.
Ricardo Sanchez
6
Dies ist keine Antwort auf die Frage.
user2864740
Hallo Jimmy, du bist der Autor, richtig? Ich möchte in der Lage sein, alle nicht vorhandenen Eigenschaften als Standardverhalten zu ignorieren (kann durch ein Flag gesteuert werden). Außerdem habe ich einen seltsamen Fehler von AutoMapper, den ich nicht herausfinden kann. Es gibt mir keine Einzelheiten.
Naomi
7

Dies scheint eine alte Frage zu sein, aber ich dachte, ich würde meine Antwort für alle anderen veröffentlichen, die so aussehen wie ich.

Ich benutze ConstructUsing, Objektinitialisierer in Verbindung mit ForAllMembers ignorieren zB

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

Die einzige Information über das Ignorieren vieler Mitglieder ist dieser Thread - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Ich denke, Sie können den in ProvidingCommonBaseClassConfiguration verwendeten Trick verwenden, um allgemeine Eigenschaften für ähnliche Klassen zu ignorieren.
Und es gibt keine Informationen über die Funktion "Den Rest ignorieren". Ich habe mir den Code schon einmal angesehen und es scheint mir sehr und sehr schwierig zu sein, solche Funktionen hinzuzufügen. Sie können auch versuchen, ein Attribut zu verwenden und damit ignorierte Eigenschaften zu markieren und generischen / allgemeinen Code hinzuzufügen, um alle markierten Eigenschaften zu ignorieren.

zihotki
quelle
1
Möglicherweise besteht eine Möglichkeit darin, die ForAllMembers-Methode zu verwenden und meine eigene IMemberConfigurationExpression zu implementieren, die eine Zeichenfolge mit den Eigenschaftsnamen der Eigenschaften empfängt, die nicht ignoriert werden sollten, und dann den Rest durchzugehen und Ignore () aufzurufen. Nur eine Idee, ich bin mir nicht sicher, ob es funktionieren würde.
Igor Brejc
Ja, das kann auch funktionieren, aber diese Methode ist schwieriger als die Verwendung von Attributen, bietet jedoch mehr Flexibilität. Schade, dass es keine Silberkugel gibt :(.
zihotki
1

Ich weiß, dass dies eine alte Frage ist, aber @jmoerdyk in Ihrer Frage:

Wie würden Sie dies in einem verketteten CreateMap () - Ausdruck in einem Profil verwenden?

Sie können diese Antwort wie folgt im Profil ctor verwenden

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

Sie können ForAllMembers verwenden, um dann nur so zu überschreiben

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

Seien Sie vorsichtig, es werden alle ignoriert, und wenn Sie keine benutzerdefinierten Zuordnungen hinzufügen, werden diese bereits ignoriert und funktionieren nicht

Ich möchte auch sagen, ob Sie einen Unit-Test für AutoMapper haben. Und Sie testen, dass alle Modelle mit allen Eigenschaften, die korrekt zugeordnet sind, keine solche Erweiterungsmethode verwenden sollten

Sie sollten explizit ignorieren

Anatoli Klamer
quelle
-1

Die aktuelle Lösung (Version 9) zum Ignorieren der Eigenschaften, die im Zieltyp nicht vorhanden sind, besteht darin, eine gespiegelte Zuordnung zu erstellen und diese umzukehren:

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

In Version 3.3.1 können Sie einfach IgnoreAllPropertiesWithAnInaccessibleSetter()oder IgnoreAllSourcePropertiesWithAnInaccessibleSetter()Methoden verwenden.

Ivan Kochurkin
quelle
6
Dies funktioniert nicht gemäß der Frage des Originalplakats. Diese Methoden ignorieren nur geschützte oder private Eigenschaften, keine Eigenschaften, die in der Quelle fehlen, aber im Zieltyp vorhanden sind.
Dan