C# 是否可以将AutoMapper配置为重用计算引用属性?

C# 是否可以将AutoMapper配置为重用计算引用属性?,c#,automapper,C#,Automapper,目前,我无法控制映射到的对象或映射自的对象,因此当前无法更改它们。我正在尝试设置一个映射,其中大约有十几个属性是从一个数组中的单个对象中获取的,必须进行计算。我的映射现在看起来与此类似: .ForMember(d => d.CountyName, o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.CountyNam

目前,我无法控制映射到的对象或映射自的对象,因此当前无法更改它们。我正在尝试设置一个映射,其中大约有十几个属性是从一个数组中的单个对象中获取的,必须进行计算。我的映射现在看起来与此类似:

.ForMember(d => d.CountyName,    o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.CountyName)))
.ForMember(d => d.County,        o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.County)))
.ForMember(d => d.TerritoryCode, o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault()?.TerritoryCode)))
.ForMember(d => d.Address,       o => o.MapFrom(x => x.Location.Address))...
如您所见,映射必须为每个属性反复计算同一段代码,每次都使用不同的最终属性。考虑到有数百个属性(我知道,很恶心),我不想在一个大的ConstructUsing()语句中使用它。性能也是一个问题,因此我只希望能够确定一次正确的territoryAndCountyOption


是否能够在开始映射时创建一个变量,以便在映射过程中使用?我不知道投影在这里是否有用,但这没有连接到数据库,我想在映射中指定正确的区域,而不是在每个Mapper.Map调用中。我是不是想错了?有更好的解决方案吗?

我不知道有什么自动映射方法可以为您预先计算字段。我解决这个问题的方法是创建TerritoryAndCountyOptionsDto对象,如果需要展开的属性,只需将它们添加为getter-only属性:

// Main DTO...
public TerritoryAndCountyOptions TerritoryAndCountyOptions { get; set; }
public string CountyName => TerritoryAndCountyOptions?.CountyName;

// Mapping for main object
.ForMember(d => d.TerritoryAndCountyOptions, o => o.MapFrom(x => x.TerritoryAndCounty.Options.OrderByDescending(y => y.Selected).FirstOrDefault())

如果您想隐藏TerritoryAndCountyOptions属性,可以将其设置为内部属性而不是公共属性。

Hmm,如果我理解您的意思,这将涉及更改我的目标对象,对吗?我目前的方向是不改变源对象或目标对象。也许我可以对中间对象使用这种方法?我的解决方案不会改变目标对象的公共表面,但它需要一些东西。我不会使用中间对象,因为您需要显式映射两次,从而失去了为您完成映射的大部分优势。嗯,不是公共曲面,但我仍然需要更改类本身。。。我也许能做到。现在我实现了一组私有类,创建了从服务到这些类的映射,然后从私有类映射到结果对象,然后,我在服务到结果的映射中使用了一个构造,它返回一个double mapper.map来完成这一切,而消费类使用它时仍然是一个mapper.map调用。谢谢你的帮助!