【问题标题】:Access child class object in base class overridden ToString method访问基类覆盖的 ToString 方法中的子类对象
【发布时间】:2021-09-19 18:14:03
【问题描述】:

我有多个具有不同结构的类。我希望我的所有子类ToString 方法都像这样被覆盖

public override string ToString()
{
    return JsonSerializer.Serialize(this);
}

这样我就可以为他们得到一个 json 序列化的字符串。

因为我有多个类并且我想要完全相同的东西,所以我想有一个基类,我将覆盖 ToString 方法,它将适用于所有子类,就像这样

public class ResponseBase
{
    public override string ToString()
    {
        return JsonSerializer.Serialize(this);
    }
}

并且有这样的子类

public class Response_1: ResponseBase
{
    public string Name {get;set;}
}

但是当我尝试这样做时,

Response_1 r = new Response_1();
r.Name = "Test";
var json = r.ToString(); // has empty json object "{}"

所以基类的覆盖 ToString 方法确实被调用,因为我得到空的 json 字符串“{}”,但它在转换为 json 时不考虑子对象属性。

所以基本上this在这一行,不代表当时的子对象而是基础对象

return JsonSerializer.Serialize(this);

所以解决方案不起作用。

有什么方法可以实现吗?要在一个地方为多个类重写 ToString 方法?

【问题讨论】:

    标签: c# inheritance this tostring


    【解决方案1】:

    问题是正在调用JsonSerializer.Serialize<T> 方法的通用版本,其中T 是ResponseBase。您可以通过两种方式解决此问题:

    使用另一个让你指定类型的重载:

    return JsonSerializer.Serialize(this, this.GetType());
    

    将值转换为object,以便调用非泛型重载:

    return JsonSerializer.Serialize((object)this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多