Antwort: CreateMissingTypeMaps
muss auf true
eingestellt sein, damit dynamisches Mapping funktioniert.AutoMapper mit dynamischem Typ: Fehlende Typ-Map-Konfiguration oder nicht unterstützte Zuordnung
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config =
new MapperConfiguration(c => { c.CreateMissingTypeMaps = true; });
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
Ich habe Wrapper um Entity Framework Abfragen Datenbank auszuführen. Ich möchte dem Benutzer erlauben, nur die erforderlichen Eigenschaften auszuwählen, aber das Ergebnis des Entitätstyps zu behalten.
Dieser Dummy-Code (ohne EF zu verwenden, aber mit derselben Ausgabe)
class Program
{
static void Main(string[] args)
{
var dummies = new[]
{
new DummyContainer
{
Name = "First",
Description = "First dummy",
DummyNumbers = new List<int> { 1, 2, 3 },
Foo = new FooThingy { Title = "Foo thingy" }
}
};
var smallDummies = dummies.Select(d => new { d.Name }).ToList();
List<DummyContainer> fullDummies = smallDummies.Select(Mapper.Map<DummyContainer>).ToList();
Debugger.Break();
}
}
class DummyContainer
{
public string Name { get; set; }
public string Description { get; set; }
public ICollection<int> DummyNumbers { get; set; }
public FooThingy Foo { get; set; }
}
class FooThingy
{
public string Title { get; set; }
}
Erhalten dieser Ausnahme:
Missing type map configuration or unsupported mapping.
Mapping types:
<>f__AnonymousType0`1 -> DummyContainer
<>f__AnonymousType0`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] -> AutoMapperWithGenerics.DummyContainer
Destination path:
DummyContainer
Source value:
{ Name = First }
Ich bin hier etwas stecken, weil Dokumentation besagt, dass AutoMapper Eigenschaft verwendet Namen, die auf das Objekt zurückgemappt werden: Dynamic and ExpandoObject Mapping.
Bitte beachten Sie, dass der obige Code ein Beispiel ist. In meiner Anwendung werden die Dinge etwas verrückt, da ich tatsächlich Generika verwende, z.
Mapper.Map<TEntity>
... und es sollte so bleiben - ich weiß nicht, welcher Entitätstyp verwendet wird. Meine Erwartung ist nur: Karteneigenschaften zum vorhandenen Typ, wenn sie fehlen, setzen Sie .
Edit: Ich habe versucht, Mapper dynamic
-T
, fast vollständigen Code hier angeben:
class Program
{
static void Main(string[] args)
{
// ...
var dumminator = new DummyService();
IEnumerable<DummyContainer> bigDummies = dumminator.GetDummies<DummyContainer>(smallDummies);
Debugger.Break();
}
}
class DummyService
{
public IEnumerable<T> GetDummies<T>(IEnumerable<dynamic> dummies)
{
var config = new MapperConfiguration(c => c.CreateMap<dynamic, T>());
IMapper mapper = config.CreateMapper();
return dummies.Select(mapper.Map<T>).ToList();
}
}
... dies wird auf Ausnahme nicht sterben, aber Ergebnis verzweifelt leer ist (alle Eigenschaften default
Wert hat.
Danke, dass Sie mich auf diese Weise anzeigten, Ihr Vorschlag ist veraltet, aber ich konnte herausfinden, wie ich dies über das Konfigurationsobjekt einstellen kann. –
Richtig, es ist eine obsolete Art und Weise. [Hier] (https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API) ist eine Dokumentation über die vorzuziehende Art, dies zu konfigurieren (was, wie ich sehen kann, Sie bereits gefunden haben). Ich war froh zu helfen. – MaKCbIMKo