我有一个基类BaseRecord
,其int
属性RecordTypeId
,其中包含enum
值的记录类型。
public class BaseRecord
{
public int RecordTypeId { get; set; }
}
set
protected
public int RecordTypeId { get; protected set; }
然后RecordTypeId
在构建后变为 0 ,无论传入的值是什么?
public class ChildRecord : BaseRecord
{
public int RecordId { get; set; }
public ChildRecord( int recordTypeId, int recordId )
{
RecordTypeId = recordTypeId;
RecordId = recordId;
}
}
由于RecordTypeId
仅在构造函数中设置,并且仅由数据访问层使用,因此我想将其设为protected
。
答案 0 :(得分:2)
在您提到的评论中,这是在反序列化之后发生的。
您没有指定您正在使用的序列化程序;但我所知道的每个序列化程序总是基于无参数构造函数和可公开设置的属性。
序列化程序创建一个对象(var newObj = new T();
,其中T是通用的)然后,对于序列化数据中的每个属性,尝试在newObj
上设置属性。
由于序列化程序未从BaseRecord
继承,因此无法访问protected
BaseRecord.
属性
来自以下评论
将序列化器视为一个单独的类。它可以访问BaseRecord
的公共属性,并设置它们的值(如果setter是公共的)。但是如果setter受到保护,那么外部类(序列化程序)无法设置该值。 JSON数据中的内容无关紧要,它是关于是否允许序列化程序(外部类)设置属性的值。
您会看到标记为public get; protected set;
的属性的类可以序列化为到 JSON(因为getter是公共的)但没有反序列化来自 JSON(因为setter不公开)。
由于RecordTypeId仅在构造函数中设置,并且仅由数据访问层使用,因此我想让它受到保护。
您是否可能将protected
与internal
混淆?
Protected
。 Internal
可由同一程序集(项目)中的每个人访问。你在这里的描述似乎表明你正试图做后者。
来自以下评论:
请记住,JSON.NET是一个自己的程序集,所以即使internal
访问也不会有效,因为它跨越程序集边框。