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
相关产品推荐
相关产品推荐

