AutoMapper表达式翻译不起作用

时间:2019-01-05 11:34:52

标签: .net .net-core automapper-8

此处的AutoMapper表达式翻译示例 http://docs.automapper.org/en/stable/Expression-Translation-(UseAsDataSource).html不起作用。

我已经从控制台应用程序(.net和.net-core)中的AutoMapper站点复制并粘贴了示例(以使示例尽可能简单),并添加了一些我自己的代码以从该站点检查示例。但这并没有我预期的那样。 它引发异常: 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 =无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容。   来源= mscorlib   堆栈跟踪:    在System.Delegate.CreateDelegateNoSecurityCheck处(类型类型,对象目标,RuntimeMethodHandle方法)    在System.Reflection.Emit.DynamicMethod.CreateDelegate处(类型委托类型,对象目标)    在System.Linq.Expressions.Compiler.LambdaCompiler.CreateDelegate()处    在System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda,DebugInfoGenerator debugInfoGenerator)    在System.Linq.Expressions.Expression`1.Compile()    在D:\ PRG \ Clinch_MVC_Dot_Net_Core \ Clinch_MVC_Dot_Net_Core \ TestAutoMap.Net \ Program.cs:line 56中的TestAutoMap.Net.Program.Main(String [] args)

1 个答案:

答案 0 :(得分:-1)

  1. 安装包AutoMapper.Extensions.ExpressionMapping-版本3.0.3

  2. 配置映射器

  3. 使用此方法mapper.MapExpression<destination>(source);