Перевод выражения AutoMapper не работает

Пример перевода выражения 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 Message = Невозможно привязать к целевому методу, поскольку его подпись или прозрачность безопасности не совместимы с таковой для типа делегата. Source=mscorlib StackTrace: в System.Delegate.CreateDelegateNoSecurityCheck(Тип типа, Цель объекта, Метод RuntimeMethodHandle) в System.Reflection.Emit.DynamicMethod.CreateDelegate(Тип делегат Type, Объект-цель) в System.Linompile.LateQateCateLateCateLateCateLateCateLateCateLateCateLateCateLateCateLate_CateLateCateLateCateLateCateLateCateLateCateLateCateLate_LateQateLateCateCateCateCateCateLateCateCateLateCateLateCateLateCateCateCateMateLateMateLateCateCateMateCateCateMateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateCateSL () в System.Linq.Expressions.Compiler.LambdaCompiler.Compile(лямбда-выражение lambda, DebugInfoGenerator debugInfoGenerator) в System.Linq.Expressions.Expression`1.Compile() в TestAutoMap.Net.Program.Main(аргументы String[]) в D:\PRG\Clinch_MVC_Dot_Net_Core\Clinch_MVC_Dot_Net_Core\TestAutoMap.Net\Program.cs: строка 56

0 ответов

  1. Установочный пакет AutoMapper.Extensions.ExpressionMapping -Version 3.0.3

  2. конфигуратор отображения

  3. использовать этот метод mapper.MapExpression<destination>(source);

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