重构多页PDF生成应用:用类替代字典后,是否有更优实现方案?
回答
你的思路完全正确——用强类型的类/列表替代Dictionary<int, string[]>绝对是更优的选择,类型安全、可读性和可维护性都提升了一大截。针对你的场景,这里有几个可以进一步优化的方向,你可以根据实际需求来选:
1. 改用C# 9+的记录类型(Record)
如果PDFPage只是单纯的数据载体,不需要复杂的业务逻辑,用记录类型可以让代码更简洁,它会自动帮你实现Equals、ToString等方法,还支持解构:
public record PDFPage( int PageNumber, string TemplateName, int TotalPages // 其他参数... );
创建实例的时候也更方便,不用逐个赋值属性:
var p1 = new PDFPage(PageNumber: 1, TemplateName: "SinglePage", TotalPages: 1);
2. 让参数不可变,提升安全性
如果PDF页面的参数在创建后不需要修改,建议把属性设为只读初始化(init关键字),或者用记录类型的默认只读特性,避免意外修改参数:
public class PDFPage { public int PageNumber { get; init; } public string TemplateName { get; init; } public int TotalPages { get; init; } // 其他参数... }
3. 用枚举替代模板名称字符串,避免拼写错误
把"单页""双页""多页"这些模板名称定义成枚举,完全杜绝字符串拼写错误的问题,类型检查更严格:
public enum PdfTemplateType { SinglePage, DoublePage, MultiPage } public record PDFPage( int PageNumber, PdfTemplateType TemplateType, int TotalPages // 其他参数... );
4. 封装页面创建逻辑,减少重复代码
如果创建PDFPage的逻辑有规律(比如根据总页数自动判断模板类型),可以写一个工厂方法或者构建器模式,把创建逻辑集中起来,让调用代码更干净:
public static class PdfPageFactory { public static PDFPage Create(int pageNumber, int totalPages) { var templateType = totalPages switch { 1 => PdfTemplateType.SinglePage, 2 => PdfTemplateType.DoublePage, _ => PdfTemplateType.MultiPage }; return new PDFPage(pageNumber, templateType, totalPages); } }
使用的时候就变成:
PDFPages.Add(PdfPageFactory.Create(1, 3)); PDFPages.Add(PdfPageFactory.Create(2, 3)); PDFPages.Add(PdfPageFactory.Create(3, 3));
总的来说,你当前用List<PDFPage>的方案已经是非常合理的了,上面这些优化都是在这个基础上的锦上添花,根据你的项目版本、复杂度和团队习惯来选择就好~
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

