You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#请求类中条件属性序列化的处理方案问询

批量插入时忽略特定属性的解决方案

现有项目中的请求类定义如下:

public class InsertStudentRequest : IRequest<InsertStudentResponse>
{
    [JsonIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    public string StdNo { get; set; }
    public Transcript Transcript { get; set; }
}

public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse>
{
    public List<InsertStudentRequest> Requests { get; set; }
}

需求为:单个插入请求允许录入Transcript属性,批量插入请求时忽略该属性,且不能直接给Transcript加[JsonIgnore]标记。以下是几种可行的解决方案:

方案1:拆分请求类(最直观易维护)

创建分场景的请求类,让每个类只负责对应场景的属性需求:

// 单条插入专用请求类,保留Transcript
public class InsertSingleStudentRequest : IRequest<InsertStudentResponse>
{
    [JsonIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    public string StdNo { get; set; }
    public Transcript Transcript { get; set; }
}

// 批量插入专用的子请求类,移除Transcript
public class InsertBulkStudentItemRequest
{
    [JsonIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    public string StdNo { get; set; }
}

// 批量插入请求类
public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse>
{
    public List<InsertBulkStudentItemRequest> Requests { get; set; }
}

这种方式职责清晰,后续维护时不会出现属性混淆问题,不需要额外配置序列化规则。

方案2:条件序列化(基于Newtonsoft.Json)

如果不想拆分类,可利用Newtonsoft.Json的ShouldSerialize特性实现动态控制:

public class InsertStudentRequest : IRequest<InsertStudentResponse>
{
    [JsonIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    public string StdNo { get; set; }
    public Transcript Transcript { get; set; }

    // 标记是否允许序列化Transcript,默认开启(单条插入场景)
    [JsonIgnore]
    public bool AllowTranscriptSerialization { get; set; } = true;

    // Newtonsoft.Json会自动调用该方法决定是否序列化Transcript
    public bool ShouldSerializeTranscript()
    {
        return AllowTranscriptSerialization;
    }
}

处理批量请求时,遍历设置标记即可:

public async Task<InsertBulkStudentResponse> Handle(InsertBulkStudentRequest request, CancellationToken cancellationToken)
{
    foreach(var req in request.Requests)
    {
        req.AllowTranscriptSerialization = false;
    }
    // 后续插入逻辑
}

注:如果项目使用System.Text.Json,需自定义JsonConverter实现类似逻辑

方案3:DTO映射(兼容已有逻辑)

如果原请求类已被大量代码引用,不想修改或拆分,可创建批量专用DTO,通过映射隔离差异:

// 批量插入专用DTO,不含Transcript
public class InsertBulkStudentItemDto
{
    [JsonIgnore]
    public int Id { get; set; }
    public string Name { get; set; }
    public string StdNo { get; set; }
}

// 修改批量请求类
public class InsertBulkStudentRequest : IRequest<InsertBulkStudentResponse>
{
    public List<InsertBulkStudentItemDto> Requests { get; set; }
}

处理请求时手动映射,忽略Transcript:

public async Task<InsertBulkStudentResponse> Handle(InsertBulkStudentRequest request, CancellationToken cancellationToken)
{
    var studentRequests = request.Requests.Select(dto => new InsertStudentRequest
    {
        Id = dto.Id,
        Name = dto.Name,
        StdNo = dto.StdNo
        // 不赋值Transcript,自然忽略该属性
    }).ToList();

    // 后续插入逻辑
}

内容的提问来源于stack exchange,提问作者Onur Sercan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:03:26