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
相关产品推荐
相关产品推荐

