
C# Switch 模式匹配(开发者用法)
在 C# 中处理 PDF 文件通常涉及处理不同类型的文档、操作或数据源。 传统上,开发人员可能依赖长长的 if-else 链或嵌套的 switch 语句来管理各种输入值和类型或输出决策。 但通过现代 C# 功能,如switch 模式匹配,您的代码可以变得更加优雅、可读和易于维护。
与像 IronPDF 这样强大的 PDF 库结合使用时,switch 模式匹配允许您为文档处理构建更智能、更简洁的逻辑。 在本文中,我们将探讨如何使用 C# 的高级模式匹配功能(例如类型模式、属性模式和关系模式)与 IronPDF 一起简化您的 PDF 生成工作流。
What is Switch Pattern Matching in C#?
Switch 模式匹配是 C# 7 中引入的一个特性,并在后续版本中不断改进。 与仅匹配常量值的传统 switch 语句不同,模式匹配使您能够在单个表达式中评估类型、属性和条件。 以下示例演示了此功能的工作原理。
示例语法
switch (input)
{
case int i when i > 0:
Console.WriteLine("Positive integer");
break;
case string s:
Console.WriteLine($"It's a string: {s}");
break;
default:
Console.WriteLine("Unknown type");
break;
}Select Case input
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case int i when i > 0:
Case Integer i [when] i > 0
Console.WriteLine("Positive integer")
'INSTANT VB TODO TASK: The following 'case' pattern variable is not converted by Instant VB:
'ORIGINAL LINE: case string s:
Case String s
Console.WriteLine($"It's a string: {s}")
Case Else
Console.WriteLine("Unknown type")
End Select此代码使用类型模式、关系运算符和空常量模式简明处理多个情况。 这项技术通过更简洁的语法显着提高了代码可读性,并支持更复杂的逻辑。
为什么将 Switch 模式匹配与 IronPDF 结合使用?

IronPDF 是一个强大的 .NET 组件,用于从 HTML、图像或原始文本生成和操作 PDF。 许多实际应用涉及处理不同模式的输入:一些文档可能来自 URL,其他来自 HTML 字符串,还有一些来自文件上传。
不再使用笨拙的 if 条件测试表达式,switch 模式匹配使您能够有效支持基于模式的逻辑。 它允许您定义应用程序如何响应不同的对象类型、指定的常量甚至布尔表达式——使用输入表达式本身来驱动工作流。
IronPDF 中使用模式匹配的常见用例
在之前的示例中,我们看到了基本语法的样子,但现在让我们看看它的实际应用。 以下代码示例是一些结合 IronPDF 和 C# 模式匹配受益的实际 PDF 任务。
1. 使用类型和属性模式处理多种输入格式
假设您的方法接受多种输入格式:HTML、URI 或本地 .html 文件。利用类型模式、属性模式和空模式,您可以轻松区分这些情况。
using System;
using System.IO;
using IronPdf;
class Program
{
static void Main()
{
object input = new Uri("https://example.com"); // Try changing this to: "<html><body>Hello</body></html>" or new FileInfo("sample.html")
var renderer = new ChromePdfRenderer();
PdfDocument pdfDoc = input switch
{
string html when html.StartsWith("<html>") =>
renderer.RenderHtmlAsPdf(html),
Uri url =>
renderer.RenderUrlAsPdf(url.ToString()),
FileInfo { Extension: ".html" } file =>
renderer.RenderHtmlAsPdf(File.ReadAllText(file.FullName)),
null => throw new ArgumentNullException("Input was null."),
_ => throw new ArgumentException("Unsupported input type for PDF conversion.")
};
pdfDoc.SaveAs("example-input-types.pdf");
Console.WriteLine("PDF created: example-input-types.pdf");
}
}Imports System
Imports System.IO
Imports IronPdf
Friend Class Program
Shared Sub Main()
Dim input As Object = New Uri("https://example.com") ' Try changing this to: "<html><body>Hello</body></html>" or new FileInfo("sample.html")
Dim renderer = New ChromePdfRenderer()
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
' PdfDocument pdfDoc = input switch
' {
' string html when html.StartsWith("<html>") => renderer.RenderHtmlAsPdf(html),
' Uri url =>
' renderer.RenderUrlAsPdf(url.ToString()),
' FileInfo { Extension: ".html" } file =>
' renderer.RenderHtmlAsPdf(File.ReadAllText(file.FullName)),
' null => throw new ArgumentNullException("Input was null."),
' _ => throw new ArgumentException("Unsupported input type for PDF conversion.")
' };
pdfDoc.SaveAs("example-input-types.pdf")
Console.WriteLine("PDF created: example-input-types.pdf")
End Sub
End Class在这里,属性模式 (FileInfo { Extension: ".html" }) 和空常量匹配 (case null) 使逻辑更具表达性和健壮性。
2. 使用位置和声明模式动态格式化 PDF
假设您在使用包含格式字符串的 PdfRequest 记录。 您可以应用位置模式、声明模式和字符串常量来自定义 PDF 格式。
using System;
using IronPdf;
public record PdfRequest(string Title, string Content, string Format);
class Program
{
static void Main()
{
PdfRequest request = new("My Report", "<h1>Monthly Report</h1><p>Generated by IronPDF.</p>", "A4");
var renderer = new ChromePdfRenderer();
// Use fully qualified enum to avoid IronWord conflict
renderer.RenderingOptions = request switch
{
PdfRequest { Format: "A4" } => new IronPdf.ChromePdfRenderOptions
{
PaperSize = IronPdf.Rendering.PdfPaperSize.A4
},
PdfRequest { Format: "Letter" } => new IronPdf.ChromePdfRenderOptions
{
PaperSize = IronPdf.Rendering.PdfPaperSize.Letter
},
_ => new IronPdf.ChromePdfRenderOptions
{
PaperSize = IronPdf.Rendering.PdfPaperSize.Legal // Fallback
}
};
var pdf = renderer.RenderHtmlAsPdf(request.Content);
pdf.SaveAs("example-formatted.pdf");
Console.WriteLine("PDF created: example-formatted.pdf");
}
}Imports System
Imports IronPdf
'INSTANT VB TODO TASK: C# 'records' are not converted by Instant VB:
'public record PdfRequest(string Title, string Content, string Format)
Friend Class Program
Shared Sub Main()
Dim request As New PdfRequest("My Report", "<h1>Monthly Report</h1><p>Generated by IronPDF.</p>", "A4")
Dim renderer = New ChromePdfRenderer()
' Use fully qualified enum to avoid IronWord conflict
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
' renderer.RenderingOptions = request switch
' {
' PdfRequest { Format: "A4" } => new IronPdf.ChromePdfRenderOptions
' {
' PaperSize = IronPdf.Rendering.PdfPaperSize.A4
' },
' PdfRequest { Format: "Letter" } => new IronPdf.ChromePdfRenderOptions
' {
' PaperSize = IronPdf.Rendering.PdfPaperSize.Letter
' },
' _ => new IronPdf.ChromePdfRenderOptions
' {
' PaperSize = IronPdf.Rendering.PdfPaperSize.Legal // Fallback
' }
' };
Dim pdf = renderer.RenderHtmlAsPdf(request.Content)
pdf.SaveAs("example-formatted.pdf")
Console.WriteLine("PDF created: example-formatted.pdf")
End Sub
End Class这种用法展示了如何表达式匹配记录中的相应属性,按照基于预期值的逻辑模式进行。
输出尺寸

3. 使用 Var 和 Not 模式生成基于角色的 PDF
using var 模式和 not 模式来处理用户角色,同时避免空或意外状态。
using System;
using IronPdf;
public abstract record UserRole;
public record Admin(string Email) : UserRole;
public record Viewer(string Email) : UserRole;
public record Guest() : UserRole;
class Program
{
static void Main()
{
UserRole currentUser = new Admin("admin@example.com"); // Try changing to Viewer or Guest
var pdf = currentUser switch
{
Admin { Email: var email } =>
new ChromePdfRenderer().RenderHtmlAsPdf($"<h1>Admin Dashboard</h1><p>Email: {email}</p>"),
Viewer =>
new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Viewer Summary</h1><p>Access limited.</p>"),
Guest =>
new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Guest Mode</h1><p>Please sign in.</p>"),
not null =>
throw new UnauthorizedAccessException("Unknown role type."),
null =>
throw new ArgumentNullException("Role cannot be null.")
};
pdf.SaveAs("example-role.pdf");
Console.WriteLine("PDF created: example-role.pdf");
}
}Imports System
Imports IronPdf
Public MustOverride ReadOnly Property UserRole() As record
public record Admin(String Email) : UserRole
public record Viewer(String Email) : UserRole
public record Guest() : UserRole
Dim Program As class
If True Then
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
' static void Main()
' {
' UserRole currentUser = New Admin("admin@example.com"); ' Try changing to Viewer or Guest
''INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
'' var pdf = currentUser switch
'' {
'' Admin { Email: var email } => new ChromePdfRenderer().RenderHtmlAsPdf($"<h1>Admin Dashboard</h1><p>Email: {email}</p>"),
'' Viewer =>
'' new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Viewer Summary</h1><p>Access limited.</p>"),
'' Guest =>
'' new ChromePdfRenderer().RenderHtmlAsPdf("<h1>Guest Mode</h1><p>Please sign in.</p>"),
'' not null =>
'' throw new UnauthorizedAccessException("Unknown role type."),
'' null =>
'' throw new ArgumentNullException("Role cannot be null.")
'' };
' pdf.SaveAs("example-role.pdf");
' Console.WriteLine("PDF created: example-role.pdf");
' }
End If这种结构提高了安全性和代码可读性,同时利用了临时变量声明,如 var email。 以下图像显示了根据不同输入值创建的不同 PDF 文件。

4. 基于用户数据的关系模式匹配
需要根据用户级别生成不同的 PDF 吗? 尝试使用两个关系模式来测试输入是否在某个范围内。
using System;
using IronPdf;
class Program
{
static void Main()
{
int userScore = 85; // Try other values: 45, 70, 101
string message = userScore switch
{
< 60 => "Needs Improvement",
>= 60 and < 80 => "Satisfactory",
>= 80 and <= 100 => "Excellent",
_ => "Invalid score"
};
var html = $"<h1>Score Report</h1><p>Score: {userScore}</p><p>Result: {message}</p>";
var pdf = new ChromePdfRenderer().RenderHtmlAsPdf(html);
pdf.SaveAs("example-score.pdf");
Console.WriteLine("PDF created: example-score.pdf");
}
}Imports System
Imports IronPdf
Friend Class Program
Shared Sub Main()
Dim userScore As Integer = 85 ' Try other values: 45, 70, 101
'INSTANT VB TODO TASK: The following 'switch expression' was not converted by Instant VB:
' string message = userScore switch
' {
' < 60 => "Needs Improvement",
' >= 60 and < 80 => "Satisfactory",
' >= 80 and <= 100 => "Excellent",
' _ => "Invalid score"
' };
Dim html = $"<h1>Score Report</h1><p>Score: {userScore}</p><p>Result: {message}</p>"
Dim pdf = (New ChromePdfRenderer()).RenderHtmlAsPdf(html)
pdf.SaveAs("example-score.pdf")
Console.WriteLine("PDF created: example-score.pdf")
End Sub
End Class关系运算符和布尔表达式使代码简洁而富有表现力。
输出

在您的项目中实施此模式的提示

- 使用记录类型来清晰和不可变的数据对象。
- 更喜欢使用 switch 表达式而不是 if-else 树以获得更清晰的逻辑。
- 使用not 模式和丢弃模式(_)来忽略不相关匹配。
- 使用添加默认案例来尽早处理未知输入。
- 将复杂情况分解到辅助方法中以提高可读性。
实际好处
***更简洁的代码:**不再有嵌套过深的 if-else 或 switch case 语句块 ***更易于测试:**隔离的模式案例简化了单元测试 ***灵活性:**添加新的输入类型时,可以轻松扩展逻辑 ***更好地分离关注点:**仅将逻辑集中在输入/输出转换上
结论:现代化您的 PDF 逻辑
Switch 模式匹配不仅仅是语法改进,它是撰写更安全、更具表达力代码的强大范式。 结合 IronPDF 的灵活渲染能力,您可以通过极少代码创建更智能、更可扩展的文档生成管道。
无论您是在构建报告生成器、文档预览器还是动态模板系统,尝试在您的 IronPDF 实现中添加模式匹配。 您将快速看到在清晰性、控制和可维护性方面的好处。
想亲自尝试 IronPDF 吗?
下载免费试用版,在购买许可证前亲自尝试 IronPDF 的强大功能。

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。
相关文章


