如果函数使用 "this",从子 class 调用函数是否包含子 class 的属性?

If a function uses "this", does invoking the function from a child class include the properties of the child class?

我创建了一个 class,其中包含一个使用“this”关键字将自身序列化为 JSON 字符串的函数,此 class 然后由子 [=19] 继承=].

public class Parent
{
    int a { get; set; }

    public ToJsonString()
    {
        return JsonSerializer.Serialize(this);
    }
}

public class Child : Parent
{
    int b { get; set; }
}

如果子 class 的实例随后调用 ToJsonString() 函数,返回的字符串将包含来自子 class 的属性,还是仅包含来自父 class 的属性]?

Child instance = new Child();
string serialized = instance.ToJsonString();

这很容易测试(见下面的代码)。

ToJsonString 的原始版本有一个 Parent 参数并且只序列化 Parent 属性。 这可以通过使用相同的实现覆盖 Child 中的 ToJsonString 来补救:

using System.Text.Json;


Console.WriteLine($"Using parent version of 'ToJsonString': {new Child().BaseToJsonString()}");
Console.WriteLine($"Using child version of 'ToJsonString': {new Child().ToJsonString()}");
Console.WriteLine($"Using better version of 'ToJsonString': {new Child().BetterToJsonString()}");


public class Parent
{
    public int A { get; set; } = 1;

    public string BaseToJsonString()
    {
        return JsonSerializer.Serialize(this);
    }
    public virtual string ToJsonString()
    {
        return JsonSerializer.Serialize(this);
    }
    public string BetterToJsonString()
    {
        return JsonSerializer.Serialize(this, GetType());
    }
}

public class Child : Parent
{
    public int B { get; set; } = 2;

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

这产生:

使用 'ToJsonString' 的父版本:{"A":1}
使用 'ToJsonString' 的子版本:{"B":2,"A":1}
使用更好的 'ToJsonString' 版本:{"B":2,"A":1}

编辑:

正如 Petrusion 正确指出的那样,另一个更简单的解决方案是强制 Serialize 方法使用实际的运行时类型(参见上面的 BetterToJsonString 方法)。