gpt4 book ai didi

c# - AutoMapper c# 运行时映射取决于对象属性

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

我想知道,如何使用 AutoMapper 将一个 Dto 映射到多个实体。

让我解释一下。

我有一个 Dto,用一个枚举来描述它的类型(以避免有多个 dto)

根据该枚举(此处为 RelationType),我想将其映射到正确的模型(实体,无论如何,它是我在数据库中使用的另一个对象)。

public class BCardDto : IMappedDto
{
public long Id { get; set; }

public BCardRelationType RelationType { get; set; }
public long RelationId { get; set; }
}

这是我的模型库:

public class BCardModel : IMappedDto
{
public long Id { get; set; }
}

这里是派生模型:

public class CardBCardModel : BCardModel
{
// ormlite, ignore that
[Reference]
public CardModel Card { get; set; }

[ForeignKey(typeof(CardModel), ForeignKeyName = "fk_bcard_card")]
public long RelationId { get; set; }
}

如何根据我提供的枚举将我的 Dto 映射到正确的模型?(我不想到处使用 Mapper.Map 但我想让 mapper 完成运行时映射工作)

这是我为模型做的 -> Dto

        cfg.CreateMap<CardBCardModel, BCardDto>()
.ForMember(s => s.RelationType, expression => expression.UseValue(BCardRelationType.Card))
.IncludeBase<BCardModel, BCardDto>();

如果我做错了什么请告诉我并解释原因:)

提前致谢,布瓦。

最佳答案

假设您有一个设置,其中有一个基类和派生基类的 2 个类:

public class ModelBase
{
public string Name { get; set; }
}

public class ModelOne : ModelBase { }

public class ModelTwo : ModelBase { }

我们还假设您有一个带有如下枚举的 DTO:

public class ModelDto
{
public string Name { get; set; }
public ModelType ModelType { get; set; }
}

public enum ModelType
{
One = 1,
Two = 2
}

现在的任务是:我如何映射 ModelDtoModelOneModelTwo取决于 ModelDto.ModelType 中的值属性(property)?

方法如下:

Mapper.Initialize(cfg => cfg.CreateMap<ModelDto, ModelBase>().ConstructUsing(x => 
{
switch (x.ModelType)
{
case ModelType.One:
return new ModelOne { Name = x.Name };
case ModelType.Two:
return new ModelTwo { Name = x.Name };
default:
throw new InvalidOperationException("Unknown ModelType...");
}
}));

用法

var dto1 = new ModelDto { ModelType = ModelType.One, Name = "ModelOne" };
var dto2 = new ModelDto { ModelType = ModelType.Two, Name = "ModelTwo" };

var one = Mapper.Map<ModelBase>(dto1);
var two = Mapper.Map<ModelBase>(dto2);

关于c# - AutoMapper c# 运行时映射取决于对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50774305/

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