C# extension method
last modified July 7, 2024
In this article we show how to define and use extension methods in C#.
C# extension method
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.
C# LINQ extension methods
LINQ is a mini language built into C# that brings more advanced query abilities.
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
C# extension method example
In the following example, we add a new method to the string
type.
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
C# extension method example II
In the next example, we add an extension method to the int
type.
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
C# generic extension method
In the next example, we define a FindAll
extension method for the
list type.
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.
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.
$ dotnet run 2 4 --------------------- wet who war
C# Base64 extension methods
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.
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 🐋
Source
In this article we have worked with extension methods in C#.
Author
List all C# tutorials.