Automapper - 从具有 IEnumerable<A> 属性的对象到 IEnumerable<B>

问题描述 投票:0回答:1

这个映射

_mapper.Map<IEnumerable<SchedulerEventViewModel>>(response);

其中响应类型为
GetWorkShiftCurrentCachedResponse

给我这个错误:

System.TypeLoadException: Method 'GetEnumerator' in type 'Proxy_System.Collections.Generic.IEnumerable`1[[StoreManager.Web.Areas.Turnazione.Models.SchedulerEventViewModel, StoreManager.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]_48512780_' from assembly 'AutoMapper.Proxies, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005' does not have an implementation.

直接映射属性

events
有效:
_mapper.Map<IEnumerable<SchedulerEventViewModel>>(response.events);

那么,映射配置应该如何才能简单地映射整个对象(我认为它会起作用)并且在映射期间不指定 IEnumerable 属性

_mapper.Map<IEnumerable<SchedulerEventViewModel>>(response);

这些是课程:

public class GetWorkShiftCurrentCachedResponse
{
    public IEnumerable<SchedulerEventCommandModel> events { get; set; }
}

public class SchedulerEventCommandModel
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
        public string RecurrenceRule { get; set; }
        public string RecurrenceID { get; set; }
        public string RecurrenceException { get; set; }
        public bool IsAllDay { get; set; }
        public int id { get; set; }
        public int dipendenteId { get; set; }
        public int idReparto { get; set; }
        public int idPuntoVendita { get; set; }
        public string stato { get; set; }
    }


public class SchedulerEventViewModel
    {
        public string Title { get; set; }
        public string Description { get; set; }

        private DateTime start;
        public DateTime Start
        {
            get
            {
                return start;
            }
            set
            {
                start = value.ToUniversalTime();
            }
        }


        private DateTime end;
        public DateTime End
        {
            get
            {
                return end;
            }
            set
            {
                end = value.ToUniversalTime();
            }
        }

        public string RecurrenceRule { get; set; }
        public string RecurrenceID { get; set; }
        public string RecurrenceException { get; set; }
        public bool IsAllDay { get; set; }


        //custom fiels
        public int id { get; set; }
        public int dipendenteId { get; set; }
        public int idReparto { get; set; }
        public int idPuntoVendita { get; set; }
        public string stato { get; set; }
    }

这是映射定义:

CreateMap<SchedulerEventViewModel, SchedulerEventCommandModel>().ReverseMap();
CreateMap<GetWorkShiftCurrentCachedResponse, IEnumerable<SchedulerEventViewModel>>().ReverseMap()
                .ForMember(o => o.events, b => b.MapFrom(x => x));
//i tried to be more explicit as well
//CreateMap<GetWorkShiftCurrentCachedResponse, IEnumerable<SchedulerEventViewModel>>().ReverseMap()
//                .ForMember(o => o.events, b => b.MapFrom(x => x.AsEnumerable()));
//CreateMap<GetWorkShiftCurrentCachedResponse, IEnumerable<SchedulerEventViewModel>>().ReverseMap()
//                .ForMember(o => o.events, b => b.MapFrom(x => x.AsEnumerable<SchedulerEventViewModel>()));
c# asp.net-mvc automapper
1个回答
0
投票

你应该使用 Custom Type Resolver 通过

ConvertUsing
正如@Lucian 提到的那样。

使用

ConvertUsing
时,不支持
ReverseMap
方法。因此,您必须单独定义映射规则。

  1. 地图从

    GetWorkShiftCurrentCachedResponse
    IEnumerable<SchedulerEventViewModel>>
    .

  2. 地图从

    IEnumerable<SchedulerEventViewModel>
    GetWorkShiftCurrentCachedResponse
    .

CreateMap<GetWorkShiftCurrentCachedResponse, IEnumerable<SchedulerEventViewModel>>()
    .ConvertUsing((src, dest, context) => context.Mapper.Map<IEnumerable<SchedulerEventViewModel>>(src.events));
                                                                                                                                           
CreateMap<IEnumerable<SchedulerEventViewModel>, GetWorkShiftCurrentCachedResponse>()
    .ConvertUsing((src, dest, context) => 
    {
        dest = new GetWorkShiftCurrentCachedResponse();
        dest.events = context.Mapper.Map<IEnumerable<SchedulerEventCommandModel>>(src);
                                                                                        
        return dest;
    });
© www.soinside.com 2019 - 2024. All rights reserved.