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

重构多页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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:28:22