可以使用其类的成员函数更改对象的实例吗?

时间:2019-01-21 13:06:33

标签: c#

成员函数应更改调用对象的实例。但是我最近的尝试并没有改变实例。

我想提供一个基类,该基类实现了将字符串(或文件)反序列化为子类对象的功能。

我尝试实现扩展方法,但无法按预期方式工作。调用实例不变。     class ChildClass:BaseClass     {         [XmlAttribute(AttributeName =“ attribute”)]         公共字符串Atribute {set;得到; }     }     Class BaseClass {}     类静态BaseClassExtension     {         公共静态无效反序列化(此BaseClass栏,字符串filePath)         {             使用(StreamReader reader = new StreamReader(filePath))             {                 XmlSerializer序列化器=新的XmlSerializer(obj.GetType());                 bar =(BaseClass)serializer.Deserialize(reader);             }         }     }     班级计划     {         公共无效Main()         {             ChildClass foo =新的ChildClass();             foo.Deserialize(“ file.xml”)         }     }      在foo.Deserialize()中填充了对象“ bar”,但是在函数结束之后,foo仍然是“空”的新ChildClass(),并且没有bar的内容。

是否有可能做这种事情?

编辑: 好吧,让我们忘记扩展方法。另一个尝试是:

class ChildClass : BaseClass
{
    [XmlAttribute(AttributeName = "atribute")]
    public string Atribute { set; get; }
}

class BaseClass
{
    public void Deserialize(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            XmlSerializer serializer = new XmlSerializer(this.GetType());
            return (BaseClass)serializer.Deserialize(reader);
        }
    }
}

class Program
{
    public void Main()
    {
        ChildClass foo = new ChildClass();

        // looks pretty bad and seems quite inconvenient to me 
        foo = (ChildClass)foo.Deserialize("file.xml")
    }
}

我的“需要”是这样的:

class BaseClass
{
    public void Deserialize(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            XmlSerializer serializer = new XmlSerializer(this.GetType());
            this = (BaseClass)serializer.Deserialize(reader);
        }
    }
}

或者我可以使用构造函数吗?

最好的问候, 马丁

2 个答案:

答案 0 :(得分:0)

这是不可能的。在您的情况下,“ bar”是静态方法范围内的局部变量,最终您将其重新分配给其他实例。您不是在处理同一个调用对象。

根据要尝试解决的解决方案,您可以将基类/子类分为两个单独的类,并在“子”中具有类型为“ base”的成员。

答案 1 :(得分:0)

我认为不可能从自身内部更改实例化的对象。但是,您可以将初始化代码作为基类的一部分放入静态方法中,该方法显式返回可以分配给新变量的对象的新实例。这样,您只需通过该方法实例化您的类一次。

基本上,您会这样做:

foo = (ChildClass)BaseClass.Deserialize("file.xml");

比从自身调用的方法重新分配foo干净一点。这样,您的BaseClass将具有:

public static BaseClass Deserialize(String filePath) { ... }