.NET 帮助

C#扩展方法(开发人员如何使用)

发布 2024年八月15日
分享:

扩展方法是 C# 的一项强大功能,可以在不修改源代码的情况下为现有类型添加新功能。 这些工具对于提高代码的可读性和可维护性非常有用。 在本指南中,我们将探讨扩展方法的基础知识以及如何实现这些方法。

什么是扩展方法?

扩展方法是一种特殊的静态方法,可以像现有类型的实例方法一样被调用。 这些工具可以方便地为现有类添加新方法,而无需更改原始源代码或继承该类。

要创建扩展方法,您需要在静态类中定义一个静态方法。 方法的第一个参数应是您要扩展的类型,并以该关键字为前缀。 这个特殊的关键字告诉 C# 编译器这是一个扩展方法。

在 C# 中实现扩展方法

既然我们已经知道了什么是扩展方法,那就来实现一个吧。 想象一下,您有一个想要反转的字符串。 您可以为字符串类创建一个扩展方法,而不是编写一个单独的函数来实现这一功能。

首先,让我们创建一个名为 StringExtensions 的新静态类。 类名并不重要,但通常的惯例是在 "扩展 "后使用被扩展类型的名称。 在该类中,我们将定义一个名为 Reverse 的静态方法:

public static class StringExtensions
{
   public static string Reverse(this string input)
   {
       char[] chars = input.ToCharArray();
       Array.Reverse(chars);
       return new string(chars);
   }
}
public static class StringExtensions
{
   public static string Reverse(this string input)
   {
       char[] chars = input.ToCharArray();
       Array.Reverse(chars);
       return new string(chars);
   }
}
Public Module StringExtensions
   <System.Runtime.CompilerServices.Extension> _
   Public Function Reverse(ByVal input As String) As String
	   Dim chars() As Char = input.ToCharArray()
	   Array.Reverse(chars)
	   Return New String(chars)
   End Function
End Module
VB   C#

在本例中,我们创建了一个名为 Reverse 的公共静态字符串方法,该方法只有一个参数。 字符串类型前的 this 关键字表示这是字符串类的扩展方法。

现在,让我们看看如何在程序类中使用这种新的扩展方法:

class Program
{
   static void Main(string[] args)
   {
       string example = "Hello, World!";
       string reversed = example.Reverse();
       Console.WriteLine(reversed); // !dlroW ,olleH
   }
}
class Program
{
   static void Main(string[] args)
   {
       string example = "Hello, World!";
       string reversed = example.Reverse();
       Console.WriteLine(reversed); // !dlroW ,olleH
   }
}
Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim example As String = "Hello, World!"
	   Dim reversed As String = example.Reverse()
	   Console.WriteLine(reversed) ' !dlroW ,olleH
   End Sub
End Class
VB   C#

请注意,我们无需创建 StringExtensions 类的实例。 相反,我们直接在字符串实例上使用 Reverse 方法,就像使用实例方法一样。

扩展方法语法

扩展方法的外观和行为与实例方法类似,但有一些重要的区别需要注意:

  • 扩展方法不能访问扩展类型的私有成员
  • 它们也不参与继承或多态性
  • 不能用扩展方法覆盖现有方法

    如果扩展类型有与扩展方法具有相同签名的方法,则始终优先使用实例方法。 只有在没有匹配的实例方法时,才会调用扩展方法。

扩展方法的实际示例

现在我们已经了解了 C# 中扩展方法的基本知识,下面让我们来看一些现实生活中的例子。

字符串扩展方法 字数

想象一下,您想计算一个字符串中的字数。 您可以为字符串类创建一个 WordCount 扩展方法:

public static class StringExtensions
{
   public static int WordCount(this string input)
   {
       return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
   }
}
public static class StringExtensions
{
   public static int WordCount(this string input)
   {
       return input.Split(new[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Length;
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

现在,您可以像这样轻松地计算字符串中的单词数:

string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // The text has 4 words.
string text = "Extension methods are awesome!";
int wordCount = text.WordCount();
Console.WriteLine($"The text has {wordCount} words."); // The text has 4 words.
Dim text As String = "Extension methods are awesome!"
Dim wordCount As Integer = text.WordCount()
Console.WriteLine($"The text has {wordCount} words.") ' The text has 4 words.
VB   C#

IEnumerable 扩展方法中值

假设您有一组数字,您想计算其中值。 您可以为 IEnumerable 创建一个扩展方法:

public static class EnumerableExtensions
{
   public static double Median(this IEnumerable source)
   {
       int[] sorted = source.OrderBy(x => x).ToArray();
       int count = sorted.Length;

       if (count == 0)
       {
           throw new InvalidOperationException("The collection is empty.");
       }

       if (count % 2 == 0)
       {
           return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
       }
       else
       {
           return sorted[count / 2];
       }
   }
}
public static class EnumerableExtensions
{
   public static double Median(this IEnumerable source)
   {
       int[] sorted = source.OrderBy(x => x).ToArray();
       int count = sorted.Length;

       if (count == 0)
       {
           throw new InvalidOperationException("The collection is empty.");
       }

       if (count % 2 == 0)
       {
           return (sorted[count / 2 - 1] + sorted[count / 2]) / 2.0;
       }
       else
       {
           return sorted[count / 2];
       }
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

使用此扩展方法,您可以轻松找到集合的中值:

int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // The median value is 4.
int[] numbers = { 5, 3, 9, 1, 4 };
double median = numbers.Median();
Console.WriteLine($"The median value is {median}."); // The median value is 4.
Dim numbers() As Integer = { 5, 3, 9, 1, 4 }
Dim median As Double = numbers.Median()
Console.WriteLine($"The median value is {median}.") ' The median value is 4.
VB   C#

日期时间扩展方法 StartOfWeek

比方说,您想查找某个日期的本周开始时间。 您可以为 DateTime 结构创建扩展方法:

public static class DateTimeExtensions
{
   public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
   {
       int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
       return dt.AddDays(-1 * diff).Date;
   }
}
public static class DateTimeExtensions
{
   public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek = DayOfWeek.Monday)
   {
       int diff = (7 + (dt.DayOfWeek - startOfWeek)) % 7;
       return dt.AddDays(-1 * diff).Date;
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

现在,您可以轻松查找任何日期的一周开始时间:

DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}."); // The start of the week is 17/06/2024.
DateTime today = DateTime.Today;
DateTime startOfWeek = today.StartOfWeek();
Console.WriteLine($"The start of the week is {startOfWeek.ToShortDateString()}."); // The start of the week is 17/06/2024.
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

使用 IronPDF 和扩展方法生成 PDF

在本节中,我们将介绍 IronPDF,这是我们业界领先的库,用于在 C# 中生成和处理 PDF 文件。 我们还将了解在使用该库时,如何利用扩展方法来创建更无缝、更直观的体验。

IronPDF 将 HTML 转换为 PDF 的方式保留了内容在网页浏览器中的布局和样式。 该库可以处理文件、URL 和字符串中的原始 HTML。 以下是简要概述:

using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();

       // 1. Convert HTML String to PDF
       var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
       var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
       pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

       // 2. Convert HTML File to PDF
       var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
       var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
       pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

       // 3. Convert URL to PDF
       var url = "http://ironpdf.com"; // Specify the URL
       var pdfFromUrl = renderer.RenderUrlAsPdf(url);
       pdfFromUrl.SaveAs("URLToPDF.pdf");
   }
}
Imports IronPdf

Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim renderer = New ChromePdfRenderer()

	   ' 1. Convert HTML String to PDF
	   Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
	   Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
	   pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

	   ' 2. Convert HTML File to PDF
	   Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
	   Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
	   pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

	   ' 3. Convert URL to PDF
	   Dim url = "http://ironpdf.com" ' Specify the URL
	   Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
	   pdfFromUrl.SaveAs("URLToPDF.pdf")
   End Sub
End Class
VB   C#

创建简单的 PDF

在深入了解扩展方法之前,我们先来看看如何使用 IronPDF 从 HTML 创建一个简单的 PDF:

using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
       PDF.SaveAs("HelloWorld.PDF");
   }
}
using IronPdf;

class Program
{
   static void Main(string[] args)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf("Hello, World!");
       PDF.SaveAs("HelloWorld.PDF");
   }
}
Imports IronPdf

Friend Class Program
   Shared Sub Main(ByVal args() As String)
	   Dim renderer = New ChromePdfRenderer()
	   Dim PDF = renderer.RenderHtmlAsPdf("Hello, World!")
	   PDF.SaveAs("HelloWorld.PDF")
   End Sub
End Class
VB   C#

该代码片段创建了一个 PDF 文件,文本为 "你好,世界!"并将其保存到名为 "HelloWorld.PDF "的文件中。

IronPDF 的扩展方法

现在,让我们来探讨如何使用扩展方法来增强 IronPDF 的功能,使其更易于使用。 例如,我们可以创建一个扩展方法,接收字符串类的实例并直接从中生成 PDF。

public static class StringExtensions
{
   public static void SaveAsPdf(this string htmlContent, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf(htmlContent);
       PDF.SaveAs(filePath);
   }
}
public static class StringExtensions
{
   public static void SaveAsPdf(this string htmlContent, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderHtmlAsPdf(htmlContent);
       PDF.SaveAs(filePath);
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

有了这个扩展方法,我们现在可以直接从字符串生成 PDF:

string html = "Extension Methods and IronPDFGenerating PDFs has never been easier!";
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF");
string html = "Extension Methods and IronPDFGenerating PDFs has never been easier!";
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF");
Dim html As String = "Extension Methods and IronPDFGenerating PDFs has never been easier!"
html.SaveAsPdf("ExtensionMethodsAndIronPDF.PDF")
VB   C#

从 URL 生成 PDF

我们可以创建的另一种有用的扩展方法是从 URL 生成 PDF 的方法。 我们可以扩展 Uri 类来实现这一目标:

public static class UriExtensions
{
   public static void SaveAsPdf(this Uri url, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
       PDF.SaveAs(filePath);
   }
}
public static class UriExtensions
{
   public static void SaveAsPdf(this Uri url, string filePath)
   {
       var renderer = new ChromePdfRenderer();;
       var PDF = renderer.RenderUrlAsPdf(url.AbsoluteUri);
       PDF.SaveAs(filePath);
   }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

现在,我们可以通过这样的 URL 轻松生成 PDF:

Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Uri url = new Uri("https://www.ironpdf.com/");
url.SaveAsPdf("UrlToPdf.PDF");
Dim url As New Uri("https://www.ironpdf.com/")
url.SaveAsPdf("UrlToPdf.PDF")
VB   C#

结论

瞧--我们探索了 C# 中扩展方法的概念,学习了如何使用静态方法和静态类来实现扩展方法,并使用了各种类型的实际示例。此外,我们还介绍了 IronPDF,这是一个用 C# 生成和处理 PDF 文件的库。 当您开始同时使用扩展方法和 IronPDF 时,您会发现您的代码会变得更简洁、更易读、更高效。

准备好使用 IronPDF了吗? 您可以从我们的30 天免费试用 IronPDF. 它还可以完全免费用于开发目的,因此您可以真正领略到它的魅力。 如果您喜欢,IronPDF 起价低至$749 for IronPDF 许可证详细信息如需更多优惠,请查看Iron Software Suite 的购买选项在这里,您可以用两个工具的价格获得所有九个 Iron Software 工具。 快乐编程!

Csharp Extension Methods 1 related to 结论

< 前一页
C#中的Try/Catch(开发者如何使用)
下一步 >
C# 使用(开发者如何运作)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >