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

C# 如何让Serializable基类的Copy、Deserialize自动返回调用者类型

解决方案

实现思路

采用**递归泛型模式(CRTP)**改造抽象基类,让基类在编译阶段绑定到具体子类类型,无需手动传递泛型参数,可同时满足实例Copy方法、静态Deserialize方法的简化调用需求。

改造后的基类代码

using Newtonsoft.Json;

public abstract class Serializable<T> where T : Serializable<T>
{
    public T Copy()
    {
        return Deserialize(Serialize());
    }

    public string Serialize()
    {
        return JsonConvert.SerializeObject(this);
    }

    public static T Deserialize(string json)
    {
        return JsonConvert.DeserializeObject<T>(json);
    }
}

子类使用示例

子类定义

public class User : Serializable<User>
{
    public string Name { get; set; }
    public int Age { get; set; }
}

调用代码

// 实例化对象
var originalUser = new User { Name = "张三", Age = 20 };

// Copy方法直接调用,自动返回User类型
var copiedUser = originalUser.Copy();

// 静态Deserialize直接通过子类调用,自动返回User类型
var deserializedUser = User.Deserialize("{\"Name\":\"李四\",\"Age\":25}");

效果说明

  • 消除了Copy方法的泛型参数冗余,且跨类型赋值会在编译阶段直接报错,不会出现编译通过但运行异常的问题。
  • 静态Deserialize方法不需要手动指定泛型参数,直接通过子类调用即可返回对应类型,符合需求。
  • 所有逻辑都封装在基类中,不需要每个子类重写Copy或Deserialize方法。

注意事项

仅需遵守一个约定:子类继承Serializable<T>时,必须将子类自身作为泛型参数T传入基类。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:00:01