AutoMapper и is*Specified свойства

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

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

С другой стороны отображающейся арены у меня есть nullable интервал как

int? Amount {get; set;}

Идеально я хотел бы за AutoMapper быть в состоянии распознать такие шаблоны и знать, как отобразить вещи в обоих направлениях без меня имеющий необходимость определить отображение для каждого отдельного свойства. Действительно ли это возможно?

10
задан skaffman 9 March 2010 в 12:15
поделиться

2 ответа

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

2
ответ дан 4 December 2019 в 04:21
поделиться

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

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

Пример:

[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);
    }
}
1
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: