C# 对象的属性何时可用?

C# 对象的属性何时可用?,c#,C#,前言:这是一个很长的问题,如果你不想阅读和理解我为什么要问这个问题,那么请不要评论为什么不简单地测试代码 我有一个对象模型,看起来有点像这样: public class MyObjectModel { public byte TypeOfNestedObject { get; set; } public string NestedObjectInJson { get; set; } public NestedObjectModel1 { get; set; }

前言:这是一个很长的问题,如果你不想阅读和理解我为什么要问这个问题,那么请不要评论为什么不简单地测试代码

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

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 ... }
     }
}
var TheObjectModel = from t in MyDC.Table
                     .....
                     select new MyObjectModel()
                     {
                         TypeOfNestedObject = t.TypeOfNestedObject,

                         NestedObjectInJson = t.NestedObjectInJson  
                     };
public NestedObjectInJson
{
   set {

       if (this.TypeOfNestedObject == 1) {

            NestedObjectModel1 = "deserialize NestedObjectInJson 
                                  into NestedObjectModel1 ";
       }
   }
}
基本上,该对象由三个嵌套对象NestedObjectModel1、NestedObjectModel2和NestedObjectModel3组成。然而,在任何给定的时间,实际上只使用其中一个。在数据库中,我存储用于重新创建此对象的字段,其中一个数据库字段是json字符串,它包含特定实例的三个嵌套对象之一

我的查询有点像这样:

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 ... }
     }
}
var TheObjectModel = from t in MyDC.Table
                     .....
                     select new MyObjectModel()
                     {
                         TypeOfNestedObject = t.TypeOfNestedObject,

                         NestedObjectInJson = t.NestedObjectInJson  
                     };
public NestedObjectInJson
{
   set {

       if (this.TypeOfNestedObject == 1) {

            NestedObjectModel1 = "deserialize NestedObjectInJson 
                                  into NestedObjectModel1 ";
       }
   }
}
我使用属性TypeOfNestedObject来知道MyObjectModel的特定实例具有哪个嵌套对象。目前,在执行查询后,我运行了一个方法,该方法读取TypeOfNestedObject并将NestedObjectInJson字符串反序列化为适当的类型,并将反序列化的对象添加为相应的嵌套对象

现在,我想向NestedObjectInJson添加一个自定义setter,以便在查询运行时设置此属性时,对象自动将字符串反序列化为适当的类型。但是,要使其工作,对象还必须正确设置属性TypeOfNestedObject。我想这样写setter:

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 ... }
     }
}
var TheObjectModel = from t in MyDC.Table
                     .....
                     select new MyObjectModel()
                     {
                         TypeOfNestedObject = t.TypeOfNestedObject,

                         NestedObjectInJson = t.NestedObjectInJson  
                     };
public NestedObjectInJson
{
   set {

       if (this.TypeOfNestedObject == 1) {

            NestedObjectModel1 = "deserialize NestedObjectInJson 
                                  into NestedObjectModel1 ";
       }
   }
}
如果我像这样编写setter,则setter运行时,属性TypeOfNestedObject需要可用。如果您注意到,在查询中,我在加载NestedObjectInJson之前加载了nestedObject的类型


所以问题是:如果我决定删除对反序列化JSONString的调用并创建这个自定义setter,由于在查询中它是在NestedObjectInJson之前设置的,所以属性TypeOfNestedObject是否可用?或者查询的写入顺序是否会使属性TypeOfNestedObject的可用性不可预测?

这会起作用,顺序是可预测的

不过,我建议不要这样做。干净的方法是提供一个接受类型和JSON并执行反序列化的构造函数。
使用这种方法,您将避免当前的问题。

这将起作用,顺序是可预测的

不过,我建议不要这样做。干净的方法是提供一个接受类型和JSON并执行反序列化的构造函数。
使用这种方法,您将避免当前的问题。

感谢您对时间耦合的建议!在查询运行之后,我将保持我的代码不变,并在业务层中运行反序列化JSONString。感谢您关于时间耦合的建议!在查询运行之后,我将保持代码的原样,并在业务层中运行反序列化JSONString。