Почему я получаю сообщение об ошибке "Отсутствует конфигурация карты типов или неподдерживаемое отображение" в autopper?

Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;

namespace TestAutomapper
{
  class Program
  {
    static void Main(string[] args)
    {

      var config = new MapperConfiguration(cfg => cfg.CreateMap<MyClassSource, MyClassDestination>());


      var mapper = config.CreateMapper();

      var source = new MyClassSource { DateTimeValue = null };

      var mapped = mapper.Map<MyClassSource, MyClassDestination>(source);
    }

  }

  public class MyClassSource
  {
    public object DateTimeValue { get; set; }
  }

  public class MyClassDestination
  {
    public DateTime? DateTimeValue { get; set; }
  }
}

Ошибка:

    AutoMapper.AutoMapperMappingException was unhandled
      HResult=-2146233088
      Message=Error mapping types.

    Mapping types:
    MyClassSource -> MyClassDestination
    TestAutomapper.MyClassSource -> TestAutomapper.MyClassDestination

    Type Map configuration:
    MyClassSource -> MyClassDestination
    TestAutomapper.MyClassSource -> TestAutomapper.MyClassDestination

    Property:
    DateTimeValue
      Source=Anonymously Hosted DynamicMethods Assembly
      StackTrace:
           at lambda_method(Closure , MyClassSource , MyClassDestination , ResolutionContext )
           at TestAutomapper.Program.Main(String[] args) in C:\Users\costa\documents\visual studio 2015\Projects\TestAutomapper\TestAutomapper\Program.cs:line 22
           at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart()
      InnerException: 
           HResult=-2146233088
           Message=Missing type map configuration or unsupported mapping.

    Mapping types:
    Object -> Nullable`1
    System.Object -> System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
           Source=Anonymously Hosted DynamicMethods Assembly
           StackTrace:
                at lambda_method(Closure , Object , Nullable`1 , ResolutionContext )
                at lambda_method(Closure , MyClassSource , MyClassDestination , ResolutionContext )
           InnerException: 

Я думал, что эта ошибка была решена ( https://github.com/AutoMapper/AutoMapper/issues/1095). Я использую Automapper 5.1.1.

Как это исправить?

Спасибо

Изменить: просто чтобы уточнить, я обеспокоен обработкой нулевого значения. Я понимаю, что преобразование ненулевого значения объекта в DateTime является сложным. В реальном коде фактическое значение в исходном объекте равно нулю или DateTime. Я думал, что ноль обрабатывается без ошибок.

Редактировать:

Я создал метод расширения To Date для преобразования объекта в дату и добавил это отображение для обработки преобразований из объекта в DateTime?:

cfg.CreateMap<object, DateTime?>().ConstructUsing(src => src.ToDate());

1 ответ

Решение

Поскольку свойства в типах источника и назначения имеют одинаковое имя, AutoMapper попытается преобразовать объект в DateTime? что невозможно, и именно поэтому вы получаете ошибку, которую вы упомянули.

Вам нужно определить, как вы хотите разрешить DateTime? имущество. Это будет работать:

var config = new MapperConfiguration(
    cfg =>
    {
        cfg.CreateMap<MyClassSource, MyClassDestination>()
            .ForMember(
                destination => destination.DateTimeValue,
                memberOptions => memberOptions.ResolveUsing(sourceMember =>
                {
                    DateTime dateTime;
                    return !DateTime.TryParse(sourceMember.DateTimeValue.ToString(), out dateTime) ? (DateTime?) null : dateTime;
                }));
    }
);

Если ваш исходный элемент является допустимым объектом даты и времени, он будет преобразован в дату и время, в противном случае свойство назначения получит нулевое значение.

Другие вопросы по тегам