2013-06-21 8 views
7

Sono nuovo in Automapper, quindi non sono sicuro che sia possibile.Può Automapper ignorare i metodi di annullamento?

Vorrei mappare una classe, ma farla ignorare i metodi che sono nulli. Di seguito è riportata un'illustrazione del codice che ho. Quando eseguo questo ottengo il seguente messaggio di eccezione.

Un'eccezione di tipo 'AutoMapper.AutoMapperMappingException' avvenuta in AutoMapper.dll

Purtroppo non è un'opzione per modificare l'interfaccia, quindi assumere se questo è possibile c'è qualche tipo di configurazione che mi manca?

public interface IThing 
{ 
    string Name { get; set; } 
    void IgnoreMe(); 
} 

public class Foo : IThing 
{ 
    public string Name { get; set; } 

    public void IgnoreMe() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fooSource = new Foo {Name = "Bobby"}; 
     Mapper.CreateMap<IThing, IThing>(); 

     var fooDestination = Mapper.Map<IThing>(fooSource); 
     Console.WriteLine(fooDestination.Name); 
     Console.ReadLine(); 
    } 
} 
+0

È possibile utilizzare il 'ConstructUsing' per specificare quale implementazione Automapper dovrebbe creare:' Mapper.CreateMap (). ConstructUsing ((ResolutionContext c) => new Foo()); ' – nemesv

+0

@nemesv grazie, ha funzionato! –

+0

Dal modo in cui si sta usando 'IThing' come tipo di destinazione? Perché 'Mapper.CreateMap ();' funzionerebbe anche ... – nemesv

risposta

7

Se si utilizza an interface as a destination tipo automapper creerà dinamicamente un'implementazione (proxy) digitare per voi.

Tuttavia, la generazione di proxy supporta solo le proprietà, quindi genera questa eccezione non troppo descrittiva per il metodo IgnoreMe. Quindi non puoi ignorare il tuo metodo IgnoreMe.

Come soluzione temporanea, è possibile specificare in modo esplicito come devono essere costruiti gli oggetti di destinazione utilizzando uno degli overload di ConstructUsing in questo caso AutoMapper non genera proxy.

Mapper.CreateMap<IThing, IThing>() 
     .ConstructUsing((ResolutionContext c) => new Foo()); 

O a meno che non si ha una buona ragione, si può direttamente mappare Foo

Mapper.CreateMap<IThing, Foo>();