gpt4 book ai didi

c# - 具有运行时映射配置的自动映射器

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:58 25 4
gpt4 key购买 nike

在我的 ASP.NET MVC 应用程序中,我需要使用某种 UI 来实现从一个对象到另一个对象的映射,以便在运行时进行映射配置,以便用户可以“随时随地”定义映射。是否有支持此类功能的库?

描述

这是我应用程序中的对象。我需要以某种方式允许用户在应用程序运行期间通过 UI 配置此对象的映射。例如我的应用程序中的某种页面,用户将能够以简单的方式定义映射,例如将 OrderDTO 的 Amout 映射到订单数量,稍后无需应用程序重新编译即可将此映射更改为 exmaple 的 ExactAmmount

//Object in DAL
public class Order
{
public int Id {get; set;}
public string Name {get; set;}
public decimal Qty {get; set;}
//Lots of other fields
}

//Object from XSD generation (for example)
public class OrderDTO
{
public int Id {get; set;}
public string Description {get; set;}
public decimal Ammout {get; set;}
public decimal VAT {get; set;}
public decimal ExactAmmount {get; set;}
//Lots of other fields
}

最佳答案

注意:由于遗留原因,我将此答案基于 AutoMapper 4.2.1 而不是当前的 5.x 版本。整体方法应该与新版本类似。

可以在程序中创建不同的映射配置和不同的映射器。此外,可以通过成员名称(string)而不是 lambda 表达式来创建成员映射。但是,仍然需要一些静态类型信息(就我的示例而言)。

请参阅以下配置文件示例,它根据属性名称准备自定义映射:

class MemberProfile : Profile
{
private string from;
private string to;

public MemberProfile(string from, string to)
{
this.from = from;
this.to = to;
}

protected override void Configure()
{
this.CreateMap<Order, OrderDTO>()
.ForMember(to, c => c.MapFrom<decimal>(from));
}
}

这可以扩展以支持不同的源属性类型和一组自定义映射,而不是单个映射。

使用示例:

var order = new Order() { Id = 1, Name = "Test", Qty = 0.5m };

var conf1 = new MapperConfiguration(c => c.AddProfile(new MemberProfile("Qty", "Ammout")));
var conf2 = new MapperConfiguration(c => c.AddProfile(new MemberProfile("Qty", "ExactAmmount")));
var res1 = conf1.CreateMapper().Map<OrderDTO>(order);
var res2 = conf2.CreateMapper().Map<OrderDTO>(order);

对于res1Qty被映射到Ammout,对于res2Qty > 映射到 ExactAmmount。由于差异被描述为字符串属性名称,因此应该可以让用户影响此配置。

关于c# - 具有运行时映射配置的自动映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com