gpt4 book ai didi

c# - 从父对象获取派生属性的数据

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

我有两个用户对象,学生和教授。每个用户都可以有自己的设置,如下所示:

public class PersonSettings
{
public Guid Id { get; set; }
public Guid PersonId { get; set; }
public PersonSettingsValues Settings { get; set; }
}

public class PersonSettingsValues
{
public bool NotificationsEnabled { get; set; }
}

public class StudentSettingsValues : PersonSettingsValues
{
public int GymPassTypeId { get; set; }
}

public class ProfessorSettingsValues : PersonSettingsValues
{
public bool AllowOfficeHours { get; set; }
}

一些设置是共享的,但是学生和教授也有自己的设置,所以我继承了模型。

我只是通过在 PersonSettings 上使用转换值将设置作为 json 存储在数据库中:

builder.Property(ps => ps.Settings).HasConversion(
s => JsonConvert.SerializeObject(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
s => JsonConvert.DeserializeObject<PersonSettingsValues>(s, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

因此 PersonSettings 表中填充了多个具有设置的记录,其中一些在设置列中的数据格式为 StudentSettings,其他为 ProfessorSettings

我想要做的是拥有一个端点,该端点将为学生返回 StudentSettings。我有:

[HttpGet("{personId}")]
public async Task<IActionResult> GetStudentSettings([FromRoute] Guid personId)
{
var personSettings = await _context.PersonSettings
.FirstOrDefaultAsync(ps => ps.PersonId == id);

return Ok(personSettings);
}

问题是设置属性只填充了 PersonSettingsValues,我没有得到 StudentSettingsValues。我不确定如何让它这样做。

我尝试改用 DTO 并使用 AutoMapper 映射到它:

public class StudentSettingsDTO
{
public Guid Id { get; set; }
public Guid PersonId { get; set; }
public StudentSettingsValues Settings { get; set; }
}

...

[HttpGet("{personId}")]
public async Task<IActionResult> GetStudentSettings([FromRoute] Guid personId)
{
var personSettings = await _context.PersonSettings
.FirstOrDefaultAsync(ps => ps.PersonId == id);

return Ok(_mapper.Map<StudentSettingsDTO>(personSettings));
}

...

CreateMap<PersonSettings, StudentSettingsDTO>()
.ForMember(ps => ps.Settings,
o => o.ResolveUsing(s => (StudentSettingsValues)s.Settings));

在我的映射中,我只是试图将设置转换为 StudentSettingsValues 类型,但我收到一条错误消息

Unable to cast object of type 'PersonSettingsValues' to type 'StudentSettingsValues'

不确定我在这里做错了什么,我怎样才能返回一个带有 StudentSettings 或 ProfessorSettings 的 PersonSettings 对象?

最佳答案

这是因为您的构建器在从数据库解析 json 时解析为 PersonSettingsValues。完成后,您将丢失所有其他数据。您有几个选择:

  1. 不确定这个构建器到底是什么以及您有多少自定义逻辑可以加。但是如果在反序列化的时候你知道它是否是教授或学生,您应该反序列化为您需要的对象。然后即使你分配它 PersonSettingsValues 你仍然会能够稍后将其转换为更具体的类型。
  2. 创建接口(interface)而不是不同的模型。 IPersonSettings 值,IStudentSettingsValues 和 IProfessorSettingsValues。然后有只是一个实现所有接口(interface)的模型。那么你的反序列化器可以序列化到那个模型。没有的值(value)观exist 将变为默认值,但它将始终被反序列化。和那么当你想从特定的上下文中使用它时,你将能够将其转换为特定界面。
  3. 反序列化为动态对象(因此它只是反序列化 json 中的任何内容),然后使用 autoMapper 将动态对象映射到具体类型。

如果不清楚,请告诉我,我会尝试给出一个代码示例。

关于c# - 从父对象获取派生属性的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51665039/

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