2012-06-25 7 views
27

Ich habe folgendes Modell:AutoMapper Mit der Eigenschaft eines Objekts in eine Zeichenfolge zur Karte

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

ich AutoMapper in der Lage sein möchten, verwenden Sie die Name Eigenschaft des Tag Typ in einen String-Eigenschaft auf der Karte in einer meiner Viewmodels.

ich einen benutzerdefinierten Resolver erstellt haben, um zu versuchen, diese Zuordnung zu handhaben, mit dem folgenden Code:

public class TagToStringResolver : ValueResolver<Tag, string> 
    { 
     protected override string ResolveCore(Tag source) 
     { 
      return source.Name ?? string.Empty; 
     } 
    } 

Ich Mapping mit dem folgenden Code:

Mapper.CreateMap<Tag, String>() 
    .ForMember(d => d, o => o.ResolveUsing<TagToStringResolver>()); 

Wenn ich die Anwendung Ich betreibe Erhalten Sie den Fehler:

Custom configuration for members is only supported for top-level individual members on a type.

Was mache ich falsch?

Antwort

40

Dies liegt daran, dass Sie die tatsächliche Zieltyp abzubilden versuchen, anstatt eine Eigenschaft des Zieltyps. Sie können erreichen, was mit Ihnen wollen:

Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty); 

obwohl es viel einfacher, nur wäre ToString auf der Tag-Klasse außer Kraft zu setzen.

+0

Danke Rob. Ich ging mit Ihrem Vorschlag, um ToString in der Klasse Tag einfach zu überschreiben. – marcusstarnes

+0

Danke dafür. Aus Naivität habe ich 'ForMember()' benutzt, als ich 'ConvertUsing()' hätte benutzen sollen. –

9

ForMember bedeutet, dass Sie die Zuordnung für ein Element bereitstellen, für das eine Zuordnung zwischen dem Typ erforderlich ist. Verwenden Sie stattdessen dies:

Mapper.CreateMap<Tag, String>().ConvertUsing<TagToStringConverter>(); 

Und Converter ist

public class TagToStringConverter : ITypeConverter<Tag, String> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     return (context.SourceValue as Tag).Name ?? string.Empty; 
    } 
} 
+0

Dies half mir, eine ganze Entität abzubilden. Ich musste ein ViewModel einer Entity zuordnen, und das war der richtige Weg, danke! – jpgrassi

+0

Sehr schönes Feature, danke Patrick! –

Verwandte Themen