假设我有一个可序列化的类,例如
[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();
答案 0 :(得分:5)
否则您无法替换对象的this
引用。您可以按照建议使用Factory / Builder。
但是,最近反序列化的对象与任何其他对象有一个区别:没有其他对象有引用。所以虽然这个是不可能的:
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);
}
}
“如果我想从调用范围中执行此操作,我会这么做”
你做到了。
答案 1 :(得分:0)
您可能希望了解工厂:http://www.dotnetperls.com/factory。据我所知,你不能从构造函数中做到这一点。
另外,请查看以下相关帖子:Using this() in C# Constructors。