如何在抽象基类中实现字符串反序列化为子类属性的方法
基类中实现通用序列化与反序列化,避免子类重复代码
你当前的反序列化方法错误在于直接给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
相关产品推荐
相关产品推荐

