Como implementar e chamar um método de extensão personalizado (Guia de Programação em C#)

Este tópico mostra como implementar seus próprios métodos de extensão para qualquer tipo do .NET. O código de cliente pode usar seus métodos de extensão, adicionando uma referência à DLL que os contém e adicionando uma diretiva using que especifica o namespace no qual os métodos de extensão são definidos.

Para definir e chamar o método de extensão

  1. Defina uma classe estática para conter o método de extensão.

    A classe deve estar visível para o código de cliente. Para obter mais informações sobre regras de acessibilidade, consulte Modificadores de acesso.

  2. Implemente o método de extensão como um método estático com, pelo menos, a mesma visibilidade da classe que a contém.

  3. O primeiro parâmetro do método especifica o tipo no qual o método opera. Ele deve ser precedido pelo modificador this.

  4. No código de chamada, adicione uma diretiva using para especificar o namespace que contém a classe do método de extensão.

  5. Chame os métodos como se fossem métodos de instância no tipo.

    Observe que o primeiro parâmetro não é especificado pelo código de chamada porque ele representa o tipo no qual o operador está sendo aplicado e o compilador já conhece o tipo do objeto. Você só precisa fornecer argumentos para os parâmetros de 2 até o n.

Exemplo

O exemplo a seguir implementa um método de extensão chamado WordCount na classe CustomExtensions.StringExtension. O método funciona na classe String, que é especificada como o primeiro parâmetro do método. O namespace CustomExtensions é importado para o namespace do aplicativo e o método é chamado dentro do método Main.

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);
        }
    }
}

Segurança do .NET

Os métodos de extensão não apresentam nenhuma vulnerabilidade de segurança específica. Eles nunca podem ser usados para representar os métodos existentes em um tipo, porque todos os conflitos de nome são resolvidos em favor da instância ou do método estático, definidos pelo próprio tipo. Os métodos de extensão não podem acessar nenhum dado particular na classe estendida.

Confira também