对象的属性何时可用?

时间:2013-02-12 14:51:54

标签: c#

前言:这是一个很长的问题,如果您不想阅读并理解我为什么要问它,那么请备注“为什么不简单地测试代码?”

我有一个看起来像这样的对象模型:

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 ... }
     }
}

基本上,该对象由三个嵌套对象(NestedObjectModel1NestedObjectModel2NestedObjectModel3)组成。但是,在任何给定时间实际上只使用其中一个。在数据库中,我存储用于重新创建此对象的字段,其中一个数据库字段是一个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的可用性不可预测?

1 个答案:

答案 0 :(得分:4)

这样可行,订单是可预测的。

但是,我建议反对这样的事情。干净的方法是提供一个构造函数,它接受类型和JSON并执行反序列化 通过这种方法,您可以避免使用目前的temporal coupling