自动映射:如何为多个属性指定一次类型转换

时间:2012-04-26 12:57:12

标签: automapper

我正在使用Automapper从包含许多本地“StringType”和“DateTimeType”字段的对象映射到我想要自动化的标准System.string,System.DateTime。有没有办法在不必在源对象上注册每个成员的情况下执行此操作?

我正在尝试做这样的事情:

        Mapper.CreateMap<StringType, string>()
            .ForAllMembers(q =>
                {
                    q.NullSubstitute(string.Empty);
                    q.MapFrom(p => p.Value);
                });
        Mapper.CreateMap<DateTimeType, DateTime>()
            .ForAllMembers(q =>
            {
                q.NullSubstitute(DateTime.MinValue);
                q.MapFrom(p => p.Value);
            });
        Mapper.CreateMap<InType, OutType>();

当我尝试从“InType”到“OutType”进行实际转换时,我一直得到“source object is null”异常。我已经尝试通过ValueResolvers定义转换,但这没有帮助。

这样做的正确方法是什么? (我在stackoverflow上看过类似的问题,但我看到的答案都提到了配置步骤和/或下载另一个库来处理这种情况:在所有这些情况下我自己的解决方案是转储Automapper并使用手写转换,节省时间并使代码更易于阅读。)

1 个答案:

答案 0 :(得分:2)

你看过自定义类型转换器了吗?

我认为应该这样做......

这个链接不是那么“年轻”,但几周前我看了它,它仍然很有用

http://lostechies.com/jimmybogard/2009/05/06/automapper-feature-custom-type-converters/

你会有类似的东西(未经测试)

public class StringTypeToStringResolver : ITypeConverter<StringType, string> {
    public string Convert(StringType source) {
        return source == null ? string.Empty : source.Value;
    }
}

和像这样的映射声明

Mapper.CreateMap<StringType, string>().ConvertUsing(new StringTypeToStringResolver());
Mapper.CreateMap<InType, OutType>();