- C# Extension Methods
- C# Extension Methods 2
What are extension methods? As the name implies, they are methods that extend or add to the functionality of a class. We can do this without changing the source code of the original class. Also, we don’t need to create a new type that inherits from that. How is this possible?
We have a post called C# Introduction.
Mosh Hamedani, in his Udemy.com course video, illustrates a use of extension methods that we show here. We want to write an extension method that allows us to take in a long string and spit out a shortened string, shortened down to the number of words we specify. For example, we may take in several sentences that represent the text in a blog post. We want to create a “one-liner” of just the first few words and we need a function to do that. Our project is called ExtensionMethods as you can see from the namespace.
Below is what our main program looks like.
using System; namespace ExtensionMethods { class Program { static void Main(string[] args) { string post = "This is supposed to be a very long blog post blah blah..."; var shortededPost = post.Shorten(5); Console.WriteLine(shortededPost); } } }
The next code listing is of a class in our project called ExtensionMethods.
using System.Linq; namespace System { public static class StringExtensions { public static string Shorten(this String str, int numberOfWords) { if (numberOfWords < 0) throw new ArgumentOutOfRangeException("numberOfWords should be greater than zero"); if (numberOfWords == 0) return ""; string[] words = str.Split(' '); if (words.Length <= numberOfWords) return str; return string.Join(" ", words.Take(numberOfWords)) + "..."; } } }
Notice that the extension method is a static method. More importantly, notice the this keyword.
Let’s just experiment a little bit with the Main program.
using System; namespace ExtensionMethods { class Program { static void Main(string[] args) { string post = "This is supposed to be a very long blog post blah blah..."; var shortededPost = post.Shorten(5); var sp2 = shortededPost.ToUpper(); var sp3 = sp2.PadRight(60); //shortededPost.PadRight(60); Console.WriteLine("[" + sp3 + "]"); } } }
Here is another example. It’s similar, but we notice that we can chain the method calls and they operate in order from left to right.
using System; namespace ExtensionMethods { class Program { static void Main(string[] args) { string senten = "A very very long sentence..."; Console.WriteLine("Number of characters: " + senten.Length); var shortededSentence = senten.Shorten(4); var s2 = shortededSentence.ToUpper(); var s3 = s2.PadRight(60); Console.WriteLine("[" + s3 + "]"); // string sent = "A very extremely long drawn-out sentence..."; var s4 = sent.Shorten(4).ToUpper().PadRight(60); Console.WriteLine("[" + s4 + "]"); var s5 = sent.PadRight(60).Shorten(4).ToUpper(); Console.WriteLine("[" + s5 + "]"); Console.WriteLine("chaining executes functions from left to right"); } } }
Below is the console output.
Number of characters: 28 [A VERY VERY LONG... ] [A VERY EXTREMELY LONG... ] [A VERY EXTREMELY LONG...] chaining executes functions from left to right Press any key to continue . . .