You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在抽象基类中实现字符串反序列化为子类属性的方法

基类中实现通用序列化与反序列化,避免子类重复代码

你当前的反序列化方法错误在于直接给this赋值——在C#实例方法里this是只读变量,无法重新赋值。要实现自动填充子类属性,需要将反序列化得到的对象的属性值复制到当前实例,而非替换引用。以下是两种可行方案:

方案一:使用System.Text.Json内置方法(.NET 6+ 推荐)

.NET 6及以上版本的System.Text.Json提供了DeserializeToExistingObject方法,可直接将JSON内容反序列化到现有实例,自动匹配并填充属性:

using System.Text.Json;

public abstract class BaseClass
{
    protected string SerializeClass()
    {
        return JsonSerializer.Serialize(this);
    }

    protected void DeserializeClass(string jsonString)
    {
        JsonSerializer.DeserializeToExistingObject(jsonString, this);
    }
}

这个方法无需指定泛型参数,框架会自动识别当前实例的类型,完成属性映射。

方案二:反射实现属性复制(兼容.NET 5及以下)

如果项目基于更低版本的.NET,可通过反射手动复制属性值:

using System.Reflection;
using System.Text.Json;

public abstract class BaseClass
{
    protected string SerializeClass()
    {
        return JsonSerializer.Serialize(this);
    }

    protected void DeserializeClass(string jsonString)
    {
        var deserializedObj = JsonSerializer.Deserialize(jsonString, this.GetType());
        if (deserializedObj == null) return;

        // 获取当前类型所有可写的公共实例属性
        var properties = this.GetType()
                             .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                             .Where(p => p.CanWrite);

        // 逐个复制属性值到当前实例
        foreach (var prop in properties)
        {
            var value = prop.GetValue(deserializedObj);
            prop.SetValue(this, value);
        }
    }
}

使用示例

无论是哪种方案,子类都无需额外编写代码,直接继承基类即可使用:

public class ClassA : BaseClass
{
    public string PropertyA { get; set; }
    public bool PropertyB { get; set; }
    public int PropertyC { get; set; }
}

// 测试代码
var original = new ClassA { PropertyA = "Demo", PropertyB = true, PropertyC = 456 };
string json = original.SerializeClass();

var target = new ClassA();
target.DeserializeClass(json);
// target的三个属性会被正确填充为original的对应值

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:39:21