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

如何阻止ReSharper建议可反序列化类的属性设为只读?

解决ReSharper“自动属性可设为只读”警告与System.Text.Json反序列化冲突的优雅方法

针对你遇到的问题,以下是几种无需手动添加禁用注释的优雅解决方案:

方法1:用序列化特性标记类/属性

ReSharper会识别常见的序列化特性,自动判断这类属性需要保留setter用于反序列化,从而跳过警告。针对System.Text.Json,你可以:

  • 给类标记[JsonObject]特性:
using System.Text.Json.Serialization;

[JsonObject]
public class MyClass
{
    public List<int> Numbers { get; set; } = new(); // 不再触发警告
}
  • 仅标记单个属性(即使不需要重命名,[JsonPropertyName]也能让ReSharper识别该属性参与序列化):
public class MyClass
{
    [JsonPropertyName("Numbers")]
    public List<int> Numbers { get; set; } = new(); // 不再触发警告
}

方法2:使用init访问器替代set(.NET 5+适用)

如果你的属性仅需要在初始化或反序列化时赋值,后续仅修改集合内容而不重新给属性本身赋值,可以将set改为init。ReSharper不会对带init的属性触发警告,同时System.Text.Json从.NET 5开始支持反序列化到init属性:

public class MyClass
{
    public List<int> Numbers { get; init; } = new(); // 无警告,且支持反序列化
}

注:此方法中属性本身无法在初始化后被重新赋值,但集合内部的元素仍可正常添加、修改,完全符合你“初始化的列表内容会被更新”的场景。

方法3:全局配置ReSharper规则排除序列化类型

如果项目中有大量序列化类,可通过全局配置让ReSharper对标记了特定序列化特性的类跳过该警告:

  1. 打开ReSharper设置(菜单:ReSharper → Options)
  2. 导航到Code Inspection → Inspection Severity
  3. 搜索AutoPropertyCanBeMadeGetOnly规则
  4. 点击规则右侧的齿轮图标,选择Edit Conditions
  5. 添加条件:Type is marked by attribute,选择JsonObjectAttribute(或你项目中使用的其他序列化特性)
  6. 保存配置后,所有标记了该特性的类中的属性都不会触发此警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:07:00