配置没有泛型的AutoMapper

时间:2013-09-02 15:08:24

标签: c# .net automapper

我正在尝试配置AutoMapper而不使用泛型,因为我想在运行时配置它。

我想配置SubstiteNulls方法,并且能够执行以下操作:

Mapper.CreateMap<Source, Dest>()
    .ForMember(dest => dest.Value, opt => opt.NullSubstitute("Other Value"));

但我无法弄清楚如何做到这一点。您可以将它们的类型对象传递到CreateMap工厂方法,但是当您使用ForMember方法时,opt对象不包含NullSubstitute方法,我想这是应该的缺乏我在这里使用的通用。

关于如何实现这一目标的任何想法?

更新

这些是我得到的选项:

enter image description here

1 个答案:

答案 0 :(得分:3)

目前NullSubstitute配置在您使用IMappingExpression的非通用版本时使用的CreateMap界面上不可用。

没有任何限制阻止Automapper在IMappingExpression上使用此方法,因此目前不支持此方法。

您有三种选择:

  • 创建issue on Github并等待其实施
  • 分叉项目并自己实施该方法。您可以使用generic version作为示例。
  • 或者,如果你想要一个快速但非常脏的解决方案。通过反射,您可以从配置中获取底层PropertyMap并在其上调用SetNullSubstitute方法:

    Mapper.CreateMap(typeof(Source), typeof(Dest))
        .ForMember("Value", opt =>
            {
                FieldInfo fieldInfo = opt.GetType().GetField("_propertyMap",
                    BindingFlags.Instance | BindingFlags.NonPublic);
                var propertyMap = (PropertyMap) fieldInfo.GetValue(opt);
                propertyMap.SetNullSubstitute("Null Value");
        });