2010-03-09 8 views
10

Ich habe eine Reihe von XSD.exe generierten Datenvertragsklassen, die für alle optionalen Elemente ein Paar von C# Eigenschaften haben wieAutoMapper und * Angegebene Eigenschaften

int Amount {get; set;} 
bool isAmountSpecified {get; set;} 

Auf der anderen Seite der Abbildungs ​​Arena Ich habe ein Nullable-int wie

int? Amount {get; set;} 

im Idealfall würde ich mag für AutoMapper der Lage sein, solche Muster zu erkennen und wissen, wie es zu kartieren in beiden Richtungen ohne mich eine Zuordnung für jede einzelne Eigenschaft angeben zu müssen. Ist das möglich?

+0

Ich denke, das könnte http://valueinjecter.codeplex.com/documentation helfen, müssen Sie nur einen Mapping-Algorithmus für int auf int? einmal und verwenden Sie es für welche Objekte Sie brauchen, müssen Sie nicht Karten für jedes Paar von Typen erstellen – Omu

Antwort

1

Ich habe ehrlich gesagt keine Ahnung, ob AutoMapper das tun wird (da ich AutoMapper nicht viel benutze), aber ich weiß, dass protobuf-net beide diese Muster unterstützt, also könnten Sie Serializer.ChangeType<,>(obj) verwenden, um zwischen ihnen zu wechseln.

Die aktuelle Version ist jedoch ziemlich abhängig von Attributen (wie [XmlElement(Order = n)]) auf die Mitglieder - ich weiß nicht, ob das ein Problem verursacht? Die in Bearbeitung befindliche Version unterstützt Vanilla-Typen (ohne Attribute), aber das ist noch nicht abgeschlossen (aber bald).

Beispiel:

[XmlType] 
public class Foo 
{ 
    [XmlElement(Order=1)] 
    public int? Value { get; set; } 
} 
[XmlType] 
public class Bar 
{ 
    [XmlElement(Order = 1)] 
    public int Value { get; set; } 
    [XmlIgnore] 
    public bool ValueSpecified { get; set; } 
} 
static class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo { Value = 123 }; 
     Bar bar = Serializer.ChangeType<Foo, Bar>(foo); 
     Console.WriteLine("{0}, {1}", bar.Value, bar.ValueSpecified); 

     foo = new Foo { Value = null }; 
     bar = Serializer.ChangeType<Foo, Bar>(foo); 
     Console.WriteLine("{0}, {1}", bar.Value, bar.ValueSpecified); 

     bar = new Bar { Value = 123, ValueSpecified = true }; 
     foo = Serializer.ChangeType<Bar, Foo>(bar); 
     Console.WriteLine(foo.Value); 

     bar = new Bar { Value = 123, ValueSpecified = false }; 
     foo = Serializer.ChangeType<Bar, Foo>(bar); 
     Console.WriteLine(foo.Value); 
    } 
} 
+0

@Marc, danke für die Info - ich wusste nicht über Protobuf-net, ich werde einen Blick darauf werfen. –

2

OK, gestern habe ich eine kurze Diskussion mit Jimmy Bogard hatte, der Autor von AutoMapper, und im Grunde, was ich suche, ist derzeit nicht möglich. Unterstützung für solche Konventionen wird irgendwann in der Zukunft implementiert werden (wenn ich ihn richtig verstanden habe :)).

Verwandte Themen