前言:这是一个很长的问题,如果您不想阅读并理解我为什么要问它,那么请备注“为什么不简单地测试代码?”
我有一个看起来像这样的对象模型:
public class MyObjectModel
{
public byte TypeOfNestedObject { get; set; }
public string NestedObjectInJson { get; set; }
public NestedObjectModel1 { get; set; }
public NestedObjectModel2 { get; set; }
public NestedObjectModel3 { get; set; }
public MyObjectModel()
{
NestedObjectModel1 = null;
NestedObjectModel2 = null;
NestedObjectModel3 = null;
}
public void DeserializeJsonString()
{
if (TypeOfNestedObject == 1) {
NestedObjectModel1 = "deserialize NestedObjectInJson
into NestedObjectModel1";
}
if (TypeOfNestedObject == 2) {
NestedObjectModel2 = "deserialize NestedObjectInJson
into NestedObjectModel2";
}
if (TypeOfNestedObject == 3) { NestedObjectModel3 ... }
}
}
基本上,该对象由三个嵌套对象(NestedObjectModel1
,NestedObjectModel2
和NestedObjectModel3
)组成。但是,在任何给定时间实际上只使用其中一个。在数据库中,我存储用于重新创建此对象的字段,其中一个数据库字段是一个json字符串,其中包含特定实例的三个嵌套对象之一。
我的查询看起来像这样:
var TheObjectModel = from t in MyDC.Table
.....
select new MyObjectModel()
{
TypeOfNestedObject = t.TypeOfNestedObject,
NestedObjectInJson = t.NestedObjectInJson
};
我使用属性TypeOfNestedObject
来了解MyObjectModel
的特定实例所具有的嵌套对象。 目前,在查询执行完毕后,我运行一个读取TypeOfNestedObject
的方法,并将字符串NestedObjectInJson
反序列化为相应的类型,并将反序列化的对象添加为相应的嵌套对象。
现在我想向NestedObjectInJson
添加一个自定义setter ,以便在查询运行时设置此属性时,该对象会自动将字符串反序列化为适当的类型。但是,要使其工作,对象还必须正确设置属性TypeOfNestedObject
。我想写这样的setter:
public NestedObjectInJson
{
set {
if (this.TypeOfNestedObject == 1) {
NestedObjectModel1 = "deserialize NestedObjectInJson
into NestedObjectModel1 ";
}
}
}
如果我像这样编写setter,那么在setter运行时,属性TypeOfNestedObject是否可用。如果您注意到,在查询中,我会在加载TypeOfNestedObject
之前加载NestedObjectInJson
。
所以问题是:如果我决定删除对DeserializeJsonString
的调用并创建这个自定义setter,那么属性TypeOfNestedObject是否可用,因为在查询中它是在NestedObjectInJson
之前设置的或者是命令在其中编写查询使得属性TypeOfNestedObject
的可用性不可预测?
答案 0 :(得分:4)
这样可行,订单是可预测的。
但是,我建议反对这样的事情。干净的方法是提供一个构造函数,它接受类型和JSON并执行反序列化 通过这种方法,您可以避免使用目前的temporal coupling。