【问题标题】:AutoMapper ResolveUsing not being invokedAutoMapper ResolveUsing 未被调用
【发布时间】:2018-05-29 21:17:20
【问题描述】:

我有一个映射,我目前使用MapFrom 并且一切都按预期工作。

我试图用ResolveUsing 替换MapFrom,但我发现我的resolve 函数根本没有被调用。就好像代码不存在(在构造函数中尝试带有断点的类形式时,它没有被命中)。

// This works as expected
CreateMap<Contact, ContactListViewModel>()
    .ForMember(dest => dest.FirstName, map =>
        map.MapFrom(s => s.RelationshipTypeId == Relationship.SELF ? s.Person.FirstName : s.FirstName))

// This doesnt. Resolver never invoked  
CreateMap<Contact, ContactListViewModel>()
    .ForMember(dest => dest.FirstName, opt => opt.ResolveUsing<CustomResolver>());

// Example resolver 
public class CustomResolver : IValueResolver<object, object, string>
{
    public CustomResolver()
    {
        // never called
    }

    public string Resolve(object source, object destination, string member, ResolutionContext context)
    {
        return ... // never invoked
    }
}

这看起来很基本,我确实有其他映射可以成功使用 ResolveUsing。关于如何进行调试并确定为什么我的映射被忽略的任何想法?

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    我遇到了这个确切的问题,使用带有 C# 9 记录的 AutoMapper 10.1.1;

    注意:.ResolveUsing&lt;&gt; 方法不再可用,它已被通用MapFrom&lt;&gt; 方法取代;

    我试图将一条记录映射到另一条记录。目标记录有一个构造函数:

    record Record(string Property)

    在我的情况下,解决方案是在所有 .ForMember() 调用之后调用 .ConstructUsing()

    最终的映射如下所示:

    CreateMap<SourceRecord, Record>()
    .ForMember(x=>x.Property,config=>config.MapFrom<PropertyResolver>)
    .ConstructUsing(source=> new Record(string.Empty))
    

    请注意,您可以使用默认值作为构造函数的参数,Automapper 仍将正确映射所有其他属性。

    当我再次遇到这个问题时,我希望这对某人或未来的我有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 2016-05-21
      • 2012-02-15
      • 2011-11-17
      相关资源
      最近更新 更多