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

JSON.NET序列化受保护属性setter问题:子类构造后属性值异常为0

问题:子类构造赋值protected基类属性后,属性值变为0?

首先说清楚,protected set访问器是允许子类在自身实例中修改基类属性的,正常情况下你在ChildRecord构造里给RecordTypeId赋值是完全有效的,不会出现赋值后变成0的情况。你遇到的这个问题大概率是代码里的小疏漏,我给你列几个最可能的原因和解决方法:

1. 子类意外重定义了同名属性

这是最常见的坑——如果你在ChildRecord里不小心又定义了一个RecordTypeId,就会隐藏基类的属性,导致你赋值的是子类自己的属性,而基类的那个还是默认的0。比如:

public class ChildRecord : BaseRecord 
{ 
    public int RecordTypeId { get; set; } // 这里重定义了同名属性,坑!
    public int RecordId { get; set; } 

    public ChildRecord( int recordTypeId, int recordId ) 
    { 
        RecordTypeId = recordTypeId; // 这里赋值的是子类的属性,不是基类的!
    }
}

解决方法:要么删除子类里重定义的RecordTypeId属性,要么明确指定赋值基类的属性:

public ChildRecord( int recordTypeId, int recordId ) 
{ 
    base.RecordTypeId = recordTypeId; // 用base明确指向基类属性
}

2. 构造后有代码重置了属性值

检查一下ChildRecord的构造函数后续代码,或者有没有其他初始化逻辑(比如属性初始化器、其他方法)在构造完成后把RecordTypeId设为0了。比如是不是不小心加了RecordTypeId = 0;的语句,或者在某个初始化方法里被重置了。

3. 赋值语句没被执行到

看看构造函数里有没有条件分支导致赋值语句被跳过。比如:

public ChildRecord( int recordTypeId, int recordId ) 
{ 
    if (recordId > 100) // 只有满足条件才赋值
    {
        RecordTypeId = recordTypeId;
    }
}

如果传入的recordId不满足条件,基类的RecordTypeId就会保持默认的0。检查构造函数逻辑,确保赋值语句一定会被执行。

快速验证方法

你可以在构造函数末尾加一句调试代码,直接打印基类属性的值,确认赋值是否生效:

public ChildRecord( int recordTypeId, int recordId ) 
{ 
    RecordTypeId = recordTypeId;
    Console.WriteLine($"构造内赋值后基类属性值:{base.RecordTypeId}");
}

如果这里打印的是你传入的正确值,但构造完成后外部访问变成0,那肯定是后续代码重置了;如果这里打印就是0,那说明赋值语句本身没起作用(比如遇到了上面的重定义问题)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:36:16