在c#中从对象中分配一个对象

本文关键字:分配 一个对象 对象 | 更新日期: 2023-09-27 18:10:25

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

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

我意识到这将无法编译;然而,我发现有时我希望从对象本身赋值。(例如,对象经历了巨大的变化,我希望不是改变每个值,而是通过调用其构造函数并将对象设置为新版本来简单地"重置"对象)。

对如何做到这一点有什么想法吗?

在c#中从对象中分配一个对象

你可以用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;
}

,这样您就可以返回一个新的实例,而不是覆盖内容,并且可以在客户端代码中切换引用。

使用静态方法返回一个新实例:

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
}