Код:
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 сложно. В реальном коде фактическое значение в исходном объекте равно null или DateTime. Я думал, что null обрабатывается без ошибок.
Редактировать:
Я создал метод расширения ToDate для преобразования объекта в дату и добавил это сопоставление для обработки преобразований из объекта в DateTime?:
cfg.CreateMap<object, DateTime?>().ConstructUsing(src => src.ToDate());
PropertyInfo pi = typeof(MyClassDestination).GetProperty("DateTimeValue"); MyClassDestination dst = new MyClassDestination(); pi.SetValue(dst, null);
работает нормально. 18.10.2016null
, он не может в общем случае сопоставить какой-либо объект со значениемDateTime?
, поэтому он терпит неудачу, потому что между этими двумя типами не определено сопоставление. Проблема, на которую вы ссылаетесь, не работает при сопоставлении между двумя свойствами одного и того же типа, допускающего значение NULL, который отличается. 18.10.2016if (source value is null and destination property type is nullable) then return null; if (source value type is the same as the destination property type) then return original value;
и т.д... 18.10.2016DateTime
. 18.10.2016