Test in a live environment
Test in production without watermarks.
Works wherever you need it to.
Extension methods are a powerful feature in C# that allow you to add new functionality to existing types without modifying their source code. They can be extremely useful in making your code more readable and maintainable. In this guide, we'll explore the basics of extension methods and how to implement them.
Extension methods are special static methods that can be called as if they were instance methods of an existing type. They are a convenient way to add new methods to an existing class without changing the original source code or inheriting from the class.
To create an extension method, you need to define a static method inside a static class. The first parameter of the method should be the type you want to extend, prefixed with this keyword. This special keyword tells the C# compiler that this is an extension method.
Now that we know what extension methods are, let's implement one. Imagine you have a string that you want to reverse. Instead of writing a separate function to do this, you can create an extension method for the string class.
First, let's create a new static class called StringExtensions. The class name is not important, but it's a common convention to use the name of the type being extended followed by "Extensions". Inside this class, we'll define a static method called 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
In this example, we created a public static string method called Reverse with a single parameter. The this keyword before the string type indicates that this is an extension method for the string class.
Now, let's see how to use this new extension method in our Program class:
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
Notice that we didn't have to create an instance of the StringExtensions class. Instead, we used the Reverse method directly on the string instance as if it were an instance method.
Extension methods look and behave like instance methods, but there are a few important differences to keep in mind:
If the extended type has a method with the same signature as an extension method, the instance method will always take precedence. Extension methods are only called when there is no matching instance method.
Now that we understand the basics of extension methods in C#, let's look at some real-life examples.
Imagine you want to count the number of words in a string. You can create a WordCount extension method for the string class:
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
Now, you can easily count the number of words in a string like this:
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.
Suppose you have a collection of numbers, and you want to calculate the median value. You can create an extension method for 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
With this extension method, you can easily find the median value of a collection:
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.
Let's say you want to find the start of the week for a given date. You can create an extension method for the DateTime struct:
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
Now, you can easily find the start of the week for any date:
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
In this section, we'll introduce IronPDF, our industry-leading library for generating and working with PDF files in C#. We'll also see how we can leverage extension methods to create a more seamless and intuitive experience when working with this library.
IronPDF converts HTML to PDF in a way that preserves the layout and style of content as it would appear in a web browser. The library can work with raw HTML from files, URLs, and strings. Here’s a quick overview:
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
Before we dive into extension methods, let's see how to create a simple PDF from HTML using IronPDF:
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
This code snippet creates a PDF with the text "Hello, World!" and saves it to a file named "HelloWorld.PDF".
Now, let's explore how we can use extension methods to enhance the functionality of IronPDF and make it easier to work with. For instance, we can create an extension method that takes an instance of the string class and generates a PDF directly from it.
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
With this extension method, we can now generate a PDF directly from a string:
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")
Another useful extension method we can create is one that generates a PDF from a URL. We can extend the Uri class to achieve this:
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
Now, we can easily generate a PDF from a URL like this:
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")
And voila - we explored the concept of extension methods in C#, learned how to implement them using static methods and static classes, and used real-life examples for various types. Furthermore, we introduced IronPDF, a library for generating and working with PDF files in C#. As you start using extension methods and IronPDF together, you'll see how much cleaner, more readable, and more efficient your code can become.
Ready to get your hands on IronPDF? You can start with our 30-day free trial of IronPDF. It’s also completely free to use for development purposes so you can really get to see what it’s made of. And if you like what you see, IronPDF starts as low as $749 for IronPDF licensing details For even bigger savings, check out the purchase options for the Iron Software Suite where you can get all nine Iron Software tools for the price of two. Happy coding!
9 .NET API products for your office documents