2010-03-09 22 views
10

tüm isteğe bağlı elemanlar için sahip eşleme alanının diğer tarafındaAutoMapper ve bir * Belirtilen özellikler

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

gibi, C# özelliklerinin bir çift xsd.exe oluşturulan veri sözleşme sınıfları bir demet AutoMapper böyle şekilleri tanıyan ve bana her özellik için bir eşleme belirtmek zorunda kalmadan her iki yönde şeyler haritasına bilen muktedir için

int? Amount {get; set;} 

gibi null int İdeal istiyorum. Mümkün mü?

+0

Bu, http://valueinjecter.codeplex.com/documentation yardımcı olabilir düşünüyorum, sadece int int için bir haritalama algoritması belirtmeniz gerekir? bir kez ve ihtiyacınız olan nesneler için kullanın, her türden – Omu

cevap

1

AutoMapper'ın (AutoMapper'ı fazla kullanmadığımdan) bunu yapıp yapmayacağını bilmiyorum, ancak protobuf-net'in bu modelleri desteklediğini biliyorum, böylece aralarında gezinmek için Serializer.ChangeType<,>(obj)'u kullanabilirsiniz.

Güncel sürümü, üyeler üzerinde özniteliklere ([XmlElement(Order = n)] gibi) sahip olma konusunda oldukça bağımlıdır - bir sorun yaratıp yaratmadığını bilmiyorum. sürümündeki sürümü, vanilya türlerini (niteliksiz) desteklemektedir, ancak bu henüz tamamlanmamıştır (ancak yakında).

Örnek:

[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 için harita oluşturmanız gerekmez, bilgi için teşekkürler - ben protobuf-net hakkında bilmiyordum, bir bakacağım. –

2

Tamam, dün Jimmy Bogard, AutoMapper yazarı kısa bir tartışma vardı ve temelde ne arıyorum şu anda mümkün değildir ettik. Bu tür sözleşmeler için destek gelecekte bir süre uygulanacaktır (eğer onu doğru anladıysam :)).