Пример перевода выражения AutoMapper отсюда
http://docs.automapper.org/en/stable/Expression-Translation-(UseAsDataSource).html не работает.
Я скопировал и вставил (чтобы сделать пример как можно более простым) пример с сайта AutoMapper в консольном приложении (.net, а также .net-core) и добавил свой собственный код, чтобы проверить пример с сайта. Но это не работает, как я ожидал.
Выдает исключение:
System.ArgumentException: «Невозможно выполнить привязку к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с сигнатурой типа делегата.»
В отладчике я вижу, что automapper не меняет путь к свойству, и это проблема.
Похоже, что автомаппер не может на самом деле переводить выражения или я делаю это неправильно.
public class OrderLine
{
public int Id { get; set; }
public int OrderId { get; set; }
public Item Item { get; set; }
public decimal Quantity { get; set; }
}
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
}
public class OrderLineDTO
{
public int Id { get; set; }
public int OrderId { get; set; }
public string Item { get; set; }
public decimal Quantity { get; set; }
}
class Program
{
static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<OrderLine, OrderLineDTO>()
.ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name));
cfg.CreateMap<OrderLineDTO, OrderLine>()
.ForMember(ol => ol.Item, conf => conf.MapFrom(dto => dto));
cfg.CreateMap<OrderLineDTO, Item>()
.ForMember(i => i.Name, conf => conf.MapFrom(dto => dto.Item));
});
Expression<Func<OrderLineDTO, bool>> dtoExpression = dto => dto.Item.StartsWith("A");
var expression = Mapper.Map<Expression<Func<OrderLine, bool>>>(dtoExpression);
//-----------------Code that I have added myself-------------------
var s = new List<OrderLine>{ new OrderLine{ Item=new Item() { Name="Az"} }, new OrderLine{ Item=new Item() { Name="Bz"} } };
var dsa = s.Where(expression.Compile());
//----------------------------------------------------------------
}
}
System.ArgumentException
HResult = 0x80070057
Сообщение = Невозможно выполнить привязку к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с сигнатурой типа делегата.
Источник = mscorlib
Трассировки стека:
в System.Delegate.CreateDelegateNoSecurityCheck (Тип типа, Цель объекта, Метод RuntimeMethodHandle)
в System.Reflection.Emit.DynamicMethod.CreateDelegate (тип делегатType, объект цели)
в System.Linq.Expressions.Compiler.LambdaCompiler.CreateDelegate ()
в System.Linq.Expressions.Compiler.LambdaCompiler.Compile (лямбда-выражение лямбда, DebugInfoGenerator debugInfoGenerator)
в System.Linq.Expressions.Expression`1.Compile ()
в TestAutoMap.Net.Program.Main (String [] args) в D: \ PRG \ Clinch_MVC_Dot_Net_Core \ Clinch_MVC_Dot_Net_Core \ TestAutoMap.Net \ Program.cs: строка 56