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



我创建了一个类,其中包含一个函数,使用"this"将自身序列化为JSON字符串。关键字,则该类随后由子类继承。

public class Parent
{
int a { get; set; }
public ToJsonString()
{
return JsonSerializer.Serialize(this);
}
}
public class Child : Parent
{
int b { get; set; }
}

如果子类的实例调用ToJsonString()函数,返回的字符串是否包含子类的属性,还是只包含父类的属性?

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方法)。

最新更新