1

我正在使用 Automapper 从包含许多我想自动映射到标准 System.string、System.DateTime 的本土“StringType”和“DateTimeType”字段的对象进行映射。有没有办法做到这一点而不必在源对象上注册每个成员?

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

        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”的实际转换时,我不断收到“源对象为空”异常。我尝试通过 ValueResolvers 定义转换,但这没有帮助。

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

4

1 回答 1

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>();
于 2012-04-26T16:24:23.163 回答