从该对象C#中分配对象

时间:2014-06-25 16:42:55

标签: c# serialization

我很想知道是否有一种简单的方法可以做到以下几点。

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);
    }
}

我意识到这不会编译;但是,我发现有时我希望从内部分配一个对象。 (即对象经历了大规模的改变,我希望不改变每个值,只需通过调用其构造函数并将对象设置为新版本来“重置”对象)。

关于如何做到这一点的任何想法?

2 个答案:

答案 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
}