从类内部修改类实例

FPG*_*PGA 0 c# constructor class this

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

[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
        }
    }
Run Code Online (Sandbox Code Playgroud)

是否可以从类内部而不是调用范围中执行此类操作?

在调用范围我会做

var dbvm = new DatabaseViewModel();
Run Code Online (Sandbox Code Playgroud)

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

在我班上我试过这个

this = //my serialized object 
Run Code Online (Sandbox Code Playgroud)

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

DatabaseViewModel dbvm = null;
if(File.Exists(".../DatabaseViewModel.bin")
dbvm = //deserialize .../DatabaseViewModel.bin
else
dbvm = new DatabaseViewModel();
Run Code Online (Sandbox Code Playgroud)

And*_*ren 5

不,你不能替换this对象的引用.您可以按照建议使用Factory/Builder.

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

class MyClass
{
    public MyClass(MyClass arg)
    {
       this = arg;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个有可能

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

   void CopyFrom(MyClass m)
   {
      // Assign fields from m.
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,您不希望将持久性逻辑和IO保留在构造函数中,这样您只需在对象的创建或反序列化之间进行选择,就可以选择其他对象(例如工厂/构建器)的责任. .

public class MyClassFactory
{
   public MyClass GetObj(int id)
   {
      if (FileExistsOnDisk(id))
         return DeserializeFromFile(id);
      else 
         return new MyClass(id);     
   }
}
Run Code Online (Sandbox Code Playgroud)

"如果我想从调用范围中做到这一点我会做的"

你也是.