我很想知道是否有一种简单的方法可以做到以下几点。
public class Person
{
public String Name{ get; set; }
public void Load(Stream stream)
{
this = new XmlSerializer(GetType()).Deserialize(stream) as Person;
}
public void Save(Stream stream)
{
new XmlSerializer(GetType()).Serialize(stream, this);
}
}
我意识到这不会编译;但是,我发现有时我希望从内部分配一个对象。 (即对象经历了大规模的改变,我希望不改变每个值,只需通过调用其构造函数并将对象设置为新版本来“重置”对象)。
关于如何做到这一点的任何想法?
答案 0 :(得分:3)
您可以使用Automapper执行此操作,只需将实例的内容复制到您的实例中:
public void Load(Stream stream)
{
Mapper.DynamicMap( new XmlSerializer(GetType()).Deserialize(stream) as Person, this );
}
尽管如此,我更喜欢
public static Person Load(Stream stream)
{
return new XmlSerializer(GetType()).Deserialize(stream) as Person;
}
这样您就可以返回一个新实例而不是覆盖内容,只需在客户端代码中切换引用。
答案 1 :(得分:0)
只需使用返回新实例的静态方法:
public class Person
{
public String Name { get; set; }
public static Person Load(Stream stream)
{
return new XmlSerializer(GetType()).Deserialize(stream) as Person;
}
}
这样称呼:
var person = Person.Load(someStream);
修改强> 我没有注意到你的要求是在接口实现中。如果可能,您可能想要重构设计。如果你不能和你的对象足够简单,你可以实例化一个新对象并复制成员:
public void Load(Stream stream)
{
Person p = new XmlSerializer(GetType()).Deserialize(stream) as Person;
// todo: copy properties from p to this:
// this.Name = p.Name;
// etc
}