自动映射器表达式转换不起作用



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

我已经在控制台应用程序(.net和.net核心)中复制并粘贴了AutoMapper网站上的示例(使示例尽可能简单),并添加了一些我自己的代码来检查该网站上的例子。但它并没有像我预期的那样起作用。它抛出异常:系统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());
//----------------------------------------------------------------
}
}

系统。ArgumentExceptionHResult=0x80070057Message=无法绑定到目标方法,因为其签名或安全透明性与委托类型的签名或安全透明度不兼容。来源=mscorlibStackTrace:在系统中。代表CreateDelegateNoSecurityCheck(类型类型、对象目标、RuntimeMethodHandle方法)在系统中。反射发出DynamicMethod。CreateDelegate(类型delegateType,对象目标)在系统中。林克。表达式。编译器。Lambda编译器。CreateDelegate()在系统中。林克。表达式。编译器。Lambda编译器。编译(LambdaExpression lambda,DebugInfoGenerator-DebugInfoGenerator)在系统中。林克。表达式。表达式`1.Compile()在TestAutoMap。网程序D:\PRG\Clinch_MVC_Dot_Net_Core\Clinch_MVC_Dot_Net_Core\TestAutoMap中的Main(String[]args)。Net\Program.cs:line 56

  1. 安装包自动映射器。扩展。ExpressionMapping-3.0.3版

  2. 配置映射程序

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

最新更新