AutoMapper将具有字符串属性的对象转换为具有URI属性的对象

时间:2018-02-06 10:05:06

标签: 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从A的对象创建B的对象,但由于URI的数据类型不同,我需要编写一些代码。 我能够通过写作实现我想要的目标

cfg.CreateMap<A, B>()
                .AfterMap((src, targ) =>
                {
                    Uri uri;
                    Uri.TryCreate(src.URI, UriKind.Absolute, out uri);
                    targ.URI = uri;
                });

想知道这是否是最佳方式?

2 个答案:

答案 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了。

此处您是docs for AutoMapper ITypeConverter

答案 1 :(得分:0)

更可重用的方法是定义从stringUri的常规映射:

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

另见Automapper docs - Custom Type Converters