03/10/26 · 3 min de lectura

Extension Methods en C#

Cómo crear, implementar y llamar a un método de extensión.

Imagen por Gaku Suyama .

Los métodos de extensión son una manera de agregar funcionalidad a un tipo sin tener que crear un tipo derivado o tener que cambiar el tipo original. Son perfectos en situaciones que requieran que agregues funcionalidad a una clase pero no puedes editar la clase.

Considera la clase Transform, la misma que forma parte de Unity y por lo tanto no tenemos acceso a su código fuente. Digamos que queremos una manera fácil de reiniciar Position (posición), Rotation (rotación) y Scale (escala) de un Transform usando una función. El lugar ideal para esta función sería la clase Transform, pero desde que no podemos agregar a la clase directamente, y no tendría sentido tener esta función en una clase derivada, vamos a crear una extensión para ella.

Los métodos de extensión deben ser colocados en una clase estática, no genérica. Es común crear una clase específica para que los contenga. Mientras que los métodos de extensión se usan como métodos de instanciación también se declaran estáticos.

Lo que hace a una función un método de extensión en vez de un método estático es el uso de la palabra reservada this en los parámetros.

Para nuestro ejemplo, vamos a crear una clase estática llamada ExtensionMethods luego crearemos un método de extensión llamado ResetTransformation().

Ten en cuenta que este método se ha declarado estático. También ten en cuenta que el primer parámetro tiene la palabra reservada this seguida de la clase Transform y un nombre de parámetro arbitrario.

public static class ExtensionMethods
{
    public static void ResetTransformation(this Transform trans)
    {
        // do something fun
    }
}

El primer parámetro será el objeto que invoca y por ende no tendrá que suministrarse cuando invoquemos esta función. Es más, este primer parámetro dicta la clase de la que este método formará parte. Si queremos más parámetros, podemos ponerlos aquí sin palabra reservada this.

Dentro del método ahora podemos escribir el código para reiniciar el Transform. Es importante tener en cuenta que a pesar de que la declaración de esta función tenga un parámetro, cuando la función se invoca no tendrá ninguno. El parámetro se vuelve implícitamente la instancia del Transform.

public static class ExtensionMethods
{
    public static void ResetTransformation(this Transform trans)
    {
        trans.position = Vector3.Zero;
        trans.localRotation = Quaternion.identity;
        trans.localScale = new Vector3(1, 1, 1);
    }
}

Para usar este método de extensión, solo necesitas buscarlo como un miembro de la clase que extendiste. En este caso, extendemos Transform y podemos ver que el método ahora forma parte de la clase Transform.

public class SomeClass : MonoBehaviour
{
    void Start()
    {
        // Call extension method
        transform.ResetTransformation();
    }
}
Gist del proyecto

Apoya el contenido de mi blog a través de:

Fuente:

Copiado!