2010-03-09 34 views
10

我有一堆这对于所有可选的元件具有类似AutoMapper并且*指定属性

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

一对C#性质对映射竞技场的另一侧我有XSD.EXE生成的数据合同类像

int? Amount {get; set;} 

一个可空INT理想情况下,我想对AutoMapper要能够认识到这种模式,并知道如何没有我不必为每个个人财产的映射事情在两个方向映射。这可能吗?

+0

我认为这可以帮助http://valueinjecter.codeplex.com/documentation,你只需要指定一个映射算法为int为int?一次,并将其用于任何需要的对象,您不必为每对类型创建地图 – Omu 2010-05-05 17:52:54

回答

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); 
    } 
} 
+0

@Marc,感谢您的信息 - 我不知道有关protobuf-net的信息,我会看一看。 – 2010-03-09 12:39:21

2

OK,昨天我已经与吉米博加德,AutoMapper的作者一个简短的讨论,基本上就是我要找的是目前是不可能的。支持这些公约将在未来的某个时间实施(如果我正确理解他的话))。