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();