访问基类重写 ToString 方法中的子类对象

Access child class object in base class overridden ToString method

提问人:Pawan Nogariya 提问时间:7/9/2021 更新时间:7/9/2021 访问量:522

问:

我有多个结构不同的类。我希望像这样覆盖我所有的子类方法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 "{}"

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

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

return JsonSerializer.Serialize(this);

所以解决方案不起作用。

有什么方法可以做到这一点吗?在一个地方为多个类重写一个方法?ToString

C# 继承 toString

评论


答:

3赞 DavidG 7/9/2021 #1

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

使用另一个重载,用于指定类型:

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

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

return JsonSerializer.Serialize((object)this);