0

假设我有一个可序列化的类,例如

[Serializable]
    public class DatabaseViewModel:MVVM.ObservableObject 
    {
        //fields
        //properties

        public DatabaseViewModel()
        {
           //if a serialization file exists then deseralize and make this instance equal to it
           //else initialize fields
        }
    }

是否可以从类内部而不是调用范围内做这样的事情?

在调用范围内我会做

var dbvm = new DatabaseViewModel();

然后我希望构造函数决定它是应该创建一个新对象还是加载一个序列化对象。

在我的课堂上我试过这个

this = //my serialized object 

如果我想从调用范围内做到这一点,我会这样做

DatabaseViewModel dbvm = null;
if(File.Exists(".../DatabaseViewModel.bin")
dbvm = //deserialize .../DatabaseViewModel.bin
else
dbvm = new DatabaseViewModel();
4

2 回答 2

5

不,您不能替换this对象的引用。正如建议的那样,您可以使用工厂/生成器。

但是,最近反序列化的对象与任何其他对象都有一个不同之处:没有其他对象可以引用它。所以虽然是不可能的:

class MyClass
{
    public MyClass(MyClass arg)
    {
       this = arg;
    }
}

这个有可能

class MyClass
{
   public MyClass(MyClass arg)
   {
      this.CopyFrom(arg);
   }

   void CopyFrom(MyClass m)
   {
      // Assign fields from m.
   }
}

现在,如果您将要复制的参数对象替换为查找反序列化数据并在内部反序列化所需的内容:

class MyClass
{
   public MyClass(int id)
   {
      if (FileExistsOnDisk(id))
      {
         MyClass m = DeserializeFromFile(id);
         CopyFrom(m);
      }
      else
      {
          // Normal construction.
      }
   }
}

但是,无论如何,您都不想将持久性逻辑和 IO 保留在构造函数中,因此只需在对象的创建或反序列化之间进行选择,由其他对象负责,例如工厂/构建器,您将获得更好的设计.

public class MyClassFactory
{
   public MyClass GetObj(int id)
   {
      if (FileExistsOnDisk(id))
         return DeserializeFromFile(id);
      else 
         return new MyClass(id);     
   }
}

“如果我想从调用范围内做到这一点,我会这样做”

你也是。

于 2013-10-21T12:40:26.990 回答
0

您可能想查看工厂: http: //www.dotnetperls.com/factory。据我所知,你不能从构造函数中做到这一点。

此外,请查看此相关帖子:在 C# 构造函数中使用 this()

于 2013-10-21T12:28:43.440 回答