C# AutoMapper将具有字符串属性的对象转换为具有URI属性的对象
我有一节课C# AutoMapper将具有字符串属性的对象转换为具有URI属性的对象,c#,automapper,C#,Automapper,我有一节课 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从
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;
});
cfg.CreateMap()
.AfterMap((src,targ)=>
{
Uri;
TryCreate(src.Uri、UriKind.Absolute、out-Uri);
target.URI=URI;
});
想知道这是否是最好的方法吗?更可重用的方法是定义从
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().ConvertUsing();
私有类转换器:类型转换器{
受保护的重写Uri ConvertCore(字符串源){
Uri;
TryCreate(source,UriKind.Absolute,out-Uri);
返回uri;
}
}
然后,您的实际映射简化为
cfg.CreateMap<A, B>()
.ForMember(dest => dest.URI, o => o.Mapfrom(src => src.URI));
cfg.CreateMap.您的解决方案工作正常,但您可以使用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;
}
}
这里的想法是,如果您有任何其他映射需要将字符串转换为Uri,AutoMapper现在已经知道如何进行转换,您不再需要显式使用.ForMember
,也不需要.AfterMap
这里是属性。属性具有相同的名称,不需要显式映射(MapFrom)。对,我刚刚添加了ForMember
,以表明不需要为此成员执行任何特殊操作<代码>cfg.CreateMap()代码>就足够了。
Mapper.Initialize(cfg => {
cfg.CreateMap<string, Uri>().ConvertUsing<StringToUriConverter>();
cfg.CreateMap<A, B>();
});
Mapper.AssertConfigurationIsValid();