如何复用顶层DTO类避免代码重复?支持多类型Items扩展
复用DTO顶层类并支持扩展的解决方案
针对你提出的DTO复用与扩展需求,最简洁高效的方式是利用泛型重构顶层类,让它们能适配不同类型的子对象,同时后续新增类型无需修改原有代码。
1. 泛型重构顶层类
将ServerResponseDTO、ServerCallDetails、Items都改为泛型类,通过泛型参数指定内部子对象的类型,这样只需定义一次顶层结构,就能适配ItemsOfTypeA、ItemsOfTypeB及后续新增的类型:
// 顶层响应DTO,泛型T指定Items中包含的子对象类型 public class ServerResponseDTO<T> { public int CallId { get; set; } public ServerCallDetails<T> Details { get; set; } } // 调用详情DTO,泛型T传递给Items类 public class ServerCallDetails<T> { public int Id { get; set; } public Items<T> Items { get; set; } } // 通用Items容器,泛型T指定具体的子对象类型 public class Items<T> { public int Id { get; set; } public T Data { get; set; } // 替换原重复命名的Items属性,避免冲突 } // 各类型的子对象只需定义自身属性,无需改动顶层类 public class ItemsOfTypeA { // 自定义TypeA的属性示例 public string PropertyA { get; set; } } public class ItemsOfTypeB { // 自定义TypeB的属性示例 public int PropertyB { get; set; } }
2. 实例化不同类型的DTO
使用时只需通过泛型参数指定具体的子对象类型,无需重复定义顶层类:
// 实例化TypeA类型的响应DTO var responseA = new ServerResponseDTO<ItemsOfTypeA> { CallId = 123, Details = new ServerCallDetails<ItemsOfTypeA> { Id = 456, Items = new Items<ItemsOfTypeA> { Id = 789, Data = new ItemsOfTypeA { PropertyA = "TypeA数据" } } } }; // 实例化TypeB类型的响应DTO var responseB = new ServerResponseDTO<ItemsOfTypeB> { CallId = 124, Details = new ServerCallDetails<ItemsOfTypeB> { Id = 457, Items = new Items<ItemsOfTypeB> { Id = 790, Data = new ItemsOfTypeB { PropertyB = 100 } } } };
3. 扩展新类型的便捷性
后续新增ItemsOfTypeC、ItemsOfTypeD时,只需定义对应的类即可,完全无需修改任何顶层泛型类:
// 新增TypeC子对象 public class ItemsOfTypeC { public bool PropertyC { get; set; } } // 直接实例化TypeC类型的响应DTO var responseC = new ServerResponseDTO<ItemsOfTypeC> { CallId = 125, Details = new ServerCallDetails<ItemsOfTypeC> { Id = 458, Items = new Items<ItemsOfTypeC> { Id = 791, Data = new ItemsOfTypeC { PropertyC = true } } } };
额外说明
原代码中Items类内部的属性名和类名重复(都叫Items),这在C#中会引发命名冲突,所以重构时将内部属性改为Data,你也可以根据实际业务需求改为更贴合的名称(比如Content、Payload等)。
内容的提问来源于stack exchange,提问作者user18154574
相关产品推荐
相关产品推荐

