我有一个班级
public class A
{
public string SomeProperty{ get; set; }
public string URI { get; set; }
}
和另一个班级
public class B
{
public string SomeProperty { get; set; }
public Uri URI { get; set; }
}
我打算使用AutoMapper从A的对象创建B的对象,但由于URI的数据类型不同,我需要编写一些代码。 我能够通过写作实现我想要的目标
cfg.CreateMap<A, B>()
.AfterMap((src, targ) =>
{
Uri uri;
Uri.TryCreate(src.URI, UriKind.Absolute, out uri);
targ.URI = uri;
});
想知道这是否是最佳方式?
答案 0 :(得分:1)
您的解决方案运行正常,但您可以使用ITypeConverter
创建字符串和URI的地图:
public class StringToUriConverter : ITypeConverter<string, Uri>
{
public Uri Convert(string source, Uri destination, ResolutionContext context)
{
Uri.TryCreate(source, UriKind.Absolute, out destination);
return destination;
}
}
根据具体情况,如果您要映射到现有对象,则必须使用
destination
参数并更新它,尽管这对Uri
没有多大意义。具体
然后你就像这样映射你的类:
Mapper.Initialize(cfg => {
cfg.CreateMap<string, Uri>().ConvertUsing<StringToUriConverter>();
cfg.CreateMap<A, B>();
});
Mapper.AssertConfigurationIsValid();
这里的想法是,如果你有任何其他需要将字符串转换为Uri的映射,AutoMapper现在已经知道如何这样做,你不需要明确地使用.ForMember
,也不需要.AfterMap
了。
答案 1 :(得分:0)
更可重用的方法是定义从string
到Uri
的常规映射:
cfg.CreateMap<string, Uri>().ConvertUsing<StringToUriConverter>();
private class StringToUriConverter: TypeConverter<string, Uri> {
protected override Uri ConvertCore(string source) {
Uri uri;
Uri.TryCreate(source, UriKind.Absolute, out uri);
return uri;
}
}
然后您的实际映射简化为
cfg.CreateMap<A, B>()
.ForMember(dest => dest.URI, o => o.Mapfrom(src => src.URI));
Automapper会识别出它必须从string URI
映射到Uri URI
,并将应用我们在上面定义的映射string -> Uri
。