C# extension method tutorial shows how to define and use extension methods in C# language. An extension method is a method added to an object after the original object was compiled.
last modified July 7, 2024
In this article we show how to define and use extension methods in C#.
Extension methods are methods that can be inserted to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.
Extension methods are static methods, but in C# they are called as if they were normal C# methods. They use this modifier in their parameters.
Extension methods are only in scope when we explicitly import the namespace into your source code with a using directive.
In the standard library, we can find plenty of extension methods, most notably in LINQ.
LINQ is a mini language built into C# that brings more advanced query abilities.
Program.cs
string[] words = [ “falcon”, “oak”, “sky”, “cloud”, “tree”, “tea”, “water” ];
Console.WriteLine(words.First(word => word.Length == 3)); Console.WriteLine(words.Last(word => word.Length == 3));
The example prints the first and the last word that has three letters.
Console.WriteLine(words.First(word => word.Length == 3)); Console.WriteLine(words.Last(word => word.Length == 3));
Both First and Last are C# extension methods that are defined in the System.Linq namespace.
$ dotnet run oak tea
In the following example, we add a new method to the string type.
Program.cs
var msg = “We walked for hours. We saw four hawks in the sky.”;
int n = msg.WordCount(); Console.WriteLine(n);
public static class ExtensionMethods { public static int WordCount(this string str) { return str.Split(new char[] { ’ ‘, ‘.’, ‘?’ }, StringSplitOptions.RemoveEmptyEntries).Length; } }
The WordCount method is a static methods defined in a static class. Its parameter contains the this keyword.
int n = msg.WordCount();
The method is called directly on the string.
$ dotnet run 11
In the next example, we add an extension method to the int type.
Program.cs
int x = 20; int y = -5;
Console.WriteLine(x.Abs()); Console.WriteLine(y.Abs());
public static class ExtensionMethods { public static int Abs(this int val) { if (val < 0) { return -val; }
return val;
}
}
The example adds the Abs method, which returns an absolute value of the given integer.
$ dotnet run 20 5
In the next example, we define a FindAll extension method for the list type.
ExtensionMethods.cs
public static class ExtensionMethods { public static List<T> FindAll<T>(this List<T> vals, List<Predicate<T>> preds) { List<T> data = new List<T>();
foreach (T e in vals)
{
bool pass = true;
foreach (Predicate<T> p in preds)
{
if (!(p(e)))
{
pass = false;
break;
}
}
if (pass) data.Add(e);
}
return data;
}
}
The FindAll method returns list elements that fill all the specified predicates.
public static List<T> FindAll<T>(this List<T> vals, List<Predicate<T>> preds)
The FindAll method takes a list of generic predicate functions as a parameter. It returns a filtered generic list.
Program.cs
List<Predicate<int>> preds = [e => e > 0, e => e % 2 == 0];
List<int> vals = [-3, -2, -1, 0, 1, 2, 3, 4]; var filtered = vals.FindAll(preds);
foreach (var e in filtered) {
Console.WriteLine(e);
}
Console.WriteLine("———————");
List<string> words = [“sky”, “wrath”, “wet”, “sun”, “pick”, “who”, “cloud”, “war”, “water”, “jump”, “ocean”];
List<Predicate<string>> preds2 = [e => e.StartsWith(“w”), e => e.Length == 3];
var filtered2 = words.FindAll(preds2);
foreach (var e in filtered2) {
Console.WriteLine(e);
}
We define two lists: an integer list and a string list. From the integer list, we filter out all positive even values. From the string list, we get all words that start with ‘w’ and have three letters.
wet who war
In the following example, we create extension methods for encoding and decoding Base64 data. Base64 is a group of similar binary-to-text encoding schemes that represent binary data in a text string format.
Program.cs
using System.Text;
namespace Base64Ex;
class Program { static void Main() { string msg = “one 🐘 and three 🐋”; string base64 = msg.EncodeBase64(); string msg2 = base64.DecodeBase64();
Console.WriteLine(msg);
Console.WriteLine(base64);
Console.WriteLine(msg2);
}
}
static class ExtensionMethods { public static string EncodeBase64(this string value) { byte[] data = Encoding.UTF8.GetBytes(value); return Convert.ToBase64String(data); }
public static string DecodeBase64(this string value)
{
byte[] data = System.Convert.FromBase64String(value);
return Encoding.UTF8.GetString(data);
}
}
The program creates the EncodeBase64 and DecodeBase64 extension methods.
string msg = “one 🐘 and three 🐋”; string base64 = msg.EncodeBase64(); string msg2 = base64.DecodeBase64();
The extension methods can be directly called on the string.
$ dotnet run one 🐘 and three 🐋 b25lIPCfkJggYW5kIHRocmVlIPCfkIs= one 🐘 and three 🐋
In this article we have worked with extension methods in C#.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all C# tutorials.