Cómo: Implementar e invocar un método de extensión personalizado (Guía de programación de C#)
Actualización: noviembre 2007
En este tema se muestra cómo implementar sus propios métodos de extensión para cualquier tipo de la Biblioteca de clases de .NET Framework o cualquier otro tipo .NET que desee extender. El código cliente puede utilizar sus métodos de extensión agregando una referencia al archivo DLL que los contiene, así como una directiva using que especifica el espacio de nombres en el que se definen los métodos de extensión.
Para definir y llamar al método de extensión
Defina una clase estática que contenga el método de extensión.
La clase debe estar visible para el código cliente. Para obtener más información sobre las reglas de accesibilidad, vea Modificadores de acceso (Guía de programación de C#).
Implemente el método de extensión como método estático que tenga al menos la misma visibilidad que la clase contenedora.
El primer parámetro del método especifica el tipo en el que funciona el método; debe estar precedido del modificador this.
En el código de llamada, agregue una directiva using para especificar el espacio de nombres que contiene la clase del método de extensión.
Llame a los métodos como si fueran métodos de instancia en el tipo.
Observe que el código de llamada no especifica el primer parámetro porque éste representa el tipo en el que se aplica el operador y el compilador ya conoce el tipo del objeto. Sólo tiene que proporcionar argumentos para segundos parámetros a través de n.
Ejemplo
En el ejemplo siguiente se implementa un método de extensión denominado WordCount en la clase MyExtensions.StringExtension. El método funciona en la clase String, que se especifica como primer parámetro de método. El espacio de nombres MyExtensions se importa al espacio de nombres de la aplicación y se llama al método desde el método Main.
using System.Linq;
using System.Text;
using System;
namespace CustomExtensions
{
//Extension methods must be defined in a static class
public static class StringExtension
{
// This is the extension method.
// The first parameter takes the "this" modifier
// and specifies the type for which the method is defined.
public static int WordCount(this String str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
namespace Extension_Methods_Simple
{
//Import the extension method namespace.
using CustomExtensions;
class Program
{
static void Main(string[] args)
{
string s = "The quick brown fox jumped over the lazy dog.";
// Call the method as if it were an
// instance method on the type. Note that the first
// parameter is not specified by the calling code.
int i = s.WordCount();
System.Console.WriteLine("Word count of s is {0}", i);
}
}
}
Compilar el código
Para ejecutar este código, debe copiarlo y pegarlo en un proyecto de aplicación de consola de Visual C# creado en Visual Studio. De manera predeterminada, el proyecto tiene como destino la versión 3.5 de .NET Framework y contiene una referencia a System.Core.dll y una directiva using para System.Linq. Si el proyecto no cumple uno o varios de estos requisitos, puede agregar lo que falte manualmente. Para obtener más información, consulte Cómo: Crear un proyecto con LINQ.
Seguridad
Los métodos de extensión no presentan vulnerabilidades de seguridad concretas. No se pueden utilizar para suplantar los métodos existentes en un tipo, ya que todas las colisiones de nombre se resuelven a favor de la instancia o el método estático definido por el propio tipo. Los métodos de extensión no pueden obtener acceso a los datos privados de la clase extendida.
Vea también
Conceptos
Referencia
Métodos de extensión (Guía de programación de C#)
Clases estáticas y sus miembros (Guía de programación de C#)