are one of the coolest features of C#. It allows our custom methods to be used on the objects without needing to extend or change the underlying class. Extension methods Extension methods are nothing but static methods. You can call them directly like any other static methods. Example { Id { ; ;} Name { ; ;} Age { ; ;} StatusCode Status { ; ;} } public sealed class User public int set get public string set get public int set get public set get Let's add an extension method for this class that checks if this user is active or not. { user.Status == User.StatusCode.Active; } } public static { class UserExtensions public static bool IsActive ( User user) this return ... userObj.IsActive(); ... You may be thinking what's the big deal, we could add this method in the class itself. However, we may not always have control over a class. It may be coming from a third party library and we may not be able to extend the class to add this method (because ). That's where extension methods shine! It's only a static method and it can only access the public interface of the object. However, it makes it look like the object has the method and it allows us to write code in a declarative fashion. User sealed Extension methods are only static methods. Only difference from the static method is keyword. You can also call it like a regular static method and it will work the same way: this UserExtensions.IsActive(userObj) What about toolbox? Our famous library is nothing but a collection of extension methods. Probably most of us have done the following a lot. Linq var = userList . ; list Where( => .Status User.StatusCode.Active) i i == We can create our toolbox by adding our own extension methods hence we can improve the code by using our new extension method. var = userList . ); list Where( => .IsActive() i i We can take this one step further by adding another extension method. public IEnumerable<User> OnlyActive( IEnumerable<User> list) { list.Where( i.IsActive()); } static this return => i Now our code reduced to this: userList .OnlyActive(); We can add other methods too. public static IEnumerable<User> { return . ; } public static IEnumerable<User> { return . ; } public static User { return . ; } OlderThan( IEnumerable<User> , ) this list int age list Where( => .Age > ) i i age YoungerThan( IEnumerable<User> , ) this list int age list Where( => .Age < ) i i age GetById( IEnumerable<User> , Id) this list int list SingleOrDefault( => .Id Id) i i == so we can write as the following. Code is self explanatory... userList .OnlyActive() .YoungerThan(20); We can also add more generic methods. { { obj == ; } { !obj.IsNull(); } IfNotNull<T>( T obj, Action<T> action){ (obj.IsNotNull()){ action(obj); } } } public static class OtherExtensions ( ) public static bool IsNull obj this object return null ( ) public static bool IsNotNull obj this object return public static void this if It's also possible to use generics as in the last method . It expects an object of type , and if it is not , it calls the delegate function that's passed in. IfNotNull T null var exists = userList . . ; userList . . ); GetById(30) IsNotNull() GetById(3) IfNotNull( => Console.WriteLine( .Name + ) user user " found!" Conclusion Extension methods are a great way to abstract logic. Its declarative nature makes the code base cleaner and more readable. https://dotnetfiddle.net/JGmKGi