---
# System prepended metadata

title: C# Study - Extension Method
tags: [Extension Method, Study, C#]

---

# C# Study - Extension Method

###### tags: `C#` `Study` `Extension Method`

# References:

* [Extension Methods (C# Programming Guide)](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods)
* [Extension Methods - C# 5.0 Pocket Reference [Book] - O'Reilly](https://www.oreilly.com/library/view/c-50-pocket/9781449335441/ch01s33.html)

---

# C# - [Extension Method](https://www.tutorialsteacher.com/csharp/csharp-extension-method)

Since C# 3.0

C# 也有 Extension!!

Extension methods, as the name suggests, are additional methods. 
Extension methods allow you __to inject additional methods 
without modifying, deriving or recompiling 
the original class, struct or interface__. 
Extension methods can be added to 
__your own custom class__, 
__.NET framework classes__, or 
__third party classes or interfaces__.

In the following example, 
``IsGreaterThan()`` is an extension method for ``int`` type, 
which returns ``true`` if the value of the ``int`` variable 
is greater than the supplied integer parameter.

```
int i = 10;
bool result = i.IsGreaterThan(100); //returns false 
```

The ``IsGreaterThan()`` method is not a method of 
``int`` data type (Int32 struct). 
It is an extension method written by the programmer for the ``int`` data type. 
The ``IsGreaterThan()`` extension method __will be available 
throughout the application by including the namespace__ 
in which it has been defined.

``int`` 是 ``Int32`` struct

The extension methods have a special symbol 
in intellisense of the visual studio, so that 
you can easily __differentiate between class methods and extension methods__.

Now let's see how to write an extension method.

An extension method is actually a special kind of static method defined in a static class. To define an extension method, first of all, define a static class.

For example, we have created an IntExtensions class under the ExtensionMethods namespace in the following example. The IntExtensions class will contain all the extension methods applicable to int data type. (You may use any name for namespace and class.)


### Example: Create a Class for Extension Methods

```
namespace ExtensionMethods{
    public static class IntExtensions {

    }
}
```

Now, __define a ``static`` method as an extension method__ 
where __the first parameter__ of the extension method 
specifies __the type on which the extension method is applicable__. 
We are going to __use this extension method on ``int`` type__. 
So __the first parameter must be ``int``__ preceded with the this modifier.

For example, the ``IsGreaterThan()`` method operates on ``int``, 
so the first parameter would be, this int i.

### Example: Define an Extension Method

```
namespace ExtensionMethods {

    public static class IntExtensions {

        public static bool IsGreaterThan(this int i, int value) {
            return i > value;
        }
    }
}
```

Now, you can include the ``ExtensionMethods`` namespace 
wherever you want to use this extension method.

```
using ExtensionMethods;

class Program {
    static void Main(string[] args) {
        int i = 10;
        bool result = i.IsGreaterThan(100); 
        Console.WriteLine(result);
    }
}
```

要有一個 ``static class``！
method 要加 ``static`` 關鍵字，然後 第一個 parameter 
一定要是 ``this type parameter_name``




Note:
The only difference between a regular ``static`` method and 
an extension method is that __the first parameter of the extension method
specifies the type that it is going to operator on, preceded by the ``this`` keyword__.





