AutoMapper和*是指定的属性

Igo*_*ejc 10 c# xsd xsd.exe automapper

我有一堆XSD.exe生成的数据协定类,所有可选元素都有一对C#属性

int Amount {get; set;}
bool isAmountSpecified {get; set;}
Run Code Online (Sandbox Code Playgroud)

在映射竞技场的另一边,我有一个可以为空的int

int? Amount {get; set;}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望AutoMapper能够识别这些模式并知道如何在两个方向上映射事物,而不必为每个单独的属性指定映射.这可能吗?

Mar*_*ell 1

老实说,我不知道 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);
    }
}
Run Code Online (Sandbox Code Playgroud)