AutoMapper и * Указанные свойства

У меня есть группа классов контрактов с данными XSD.exe, которые для всех необязательных элементов имеют пару свойств С#, таких как

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

С другой стороны арены отображения у меня есть nullable int like

int? Amount {get; set;}

В идеале я хотел бы, чтобы AutoMapper мог распознавать такие шаблоны и знать, как сопоставлять объекты в обоих направлениях, без необходимости указывать сопоставление для каждого отдельного свойства. Возможно ли это?

Ответ 1

Хорошо, вчера у меня была короткая дискуссия с Джимми Богардом, автором AutoMapper, и в основном то, что я ищу, в настоящее время не представляется возможным. Поддержка таких соглашений будет реализована в будущем (если я правильно его понял:)).

Ответ 2

Я честно не знаю, будет ли AutoMapper делать это (поскольку я не использую AutoMapper много), но я знаю, что protobuf-net поддерживает оба эти шаблона, поэтому вы можете использовать Serializer.ChangeType<,>(obj) для переключения между ними.

Текущая версия, однако, очень зависит от наличия у участников атрибутов (например, [XmlElement(Order = n)]) - я не знаю, вызвала ли это проблему? Текущая версия поддерживает типы ванили (без атрибутов), но это еще не завершено (но скоро).

Пример:

[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);
    }
}