我有一堆这对于所有可选的元件具有类似AutoMapper并且*指定属性
int Amount {get; set;}
bool isAmountSpecified {get; set;}
一对C#性质对映射竞技场的另一侧我有XSD.EXE生成的数据合同类像
int? Amount {get; set;}
一个可空INT理想情况下,我想对AutoMapper要能够认识到这种模式,并知道如何没有我不必为每个个人财产的映射事情在两个方向映射。这可能吗?
我有一堆这对于所有可选的元件具有类似AutoMapper并且*指定属性
int Amount {get; set;}
bool isAmountSpecified {get; set;}
一对C#性质对映射竞技场的另一侧我有XSD.EXE生成的数据合同类像
int? Amount {get; set;}
一个可空INT理想情况下,我想对AutoMapper要能够认识到这种模式,并知道如何没有我不必为每个个人财产的映射事情在两个方向映射。这可能吗?
我真的不知道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);
}
}
@Marc,感谢您的信息 - 我不知道有关protobuf-net的信息,我会看一看。 – 2010-03-09 12:39:21
OK,昨天我已经与吉米博加德,AutoMapper的作者一个简短的讨论,基本上就是我要找的是目前是不可能的。支持这些公约将在未来的某个时间实施(如果我正确理解他的话))。
我认为这可以帮助http://valueinjecter.codeplex.com/documentation,你只需要指定一个映射算法为int为int?一次,并将其用于任何需要的对象,您不必为每对类型创建地图 – Omu 2010-05-05 17:52:54