Compartilhar via


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

Este artigo mostra como implementar seus próprios métodos de extensão para qualquer tipo do .NET. O código do cliente pode usar seus métodos de extensão. Os projetos de cliente devem fazer referência ao assembly (montagem) nos quais estão contidos. Os projetos cliente devem adicionar uma diretriz de using (utilização) que especifica o namespace no qual os métodos de extensão são definidos.

A partir do C# 14, há duas sintaxes que você pode usar para definir métodos de extensão. O C# 14 adiciona blocos de extensão , em que você define membros de extensão para um tipo. Antes do C# 14, você adiciona esse modificador ao primeiro parâmetro de um método estático para indicar que o método aparece como um membro de uma instância do tipo de parâmetro.

Blocos de extensão (C# 14 e posterior)

A partir do C# 14, você pode declarar métodos de extensão usando blocos de extensão. Um bloco de extensão é um bloco em uma classe estática não aninhada, não genérica, que contém membros de extensão para um tipo ou uma instância desse tipo.

Para definir e chamar um método de extensão usando blocos de extensão:

  1. Defina uma classe estática para conter o método de extensão. A classe não pode ser aninhada dentro de outro tipo e deve estar visível para o código do cliente. Para obter mais informações sobre regras de acessibilidade, consulte Modificadores de acesso.
  2. Use um bloco de extensão para declarar membros de extensão para um tipo.
  3. No código de chamada, adicione uma diretiva using para especificar o namespace que contém a classe do método de extensão.
  4. Chame os métodos como métodos de instância no tipo.

O exemplo a seguir implementa um método de extensão chamado WordCount usando a sintaxe do bloco de extensão C# 14. O método opera na String classe. O CustomExtensions namespace é importado para o namespace do aplicativo e o método é chamado como se fosse um método de instância na cadeia de caracteres.

using CustomExtensions;

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 {i}");


namespace CustomExtensions
{
    // Extension methods must be defined in a static class.
    public static class StringExtension
    {
        extension(string str)
        {
            // This is the extension member.
            // The `str` parameter is declared on the extension declaration.
            public int WordCount()
            {
                return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
            }
        }
    }
}

Métodos de extensão (versões anteriores)

Antes do C# 14, você declara um método de extensão adicionando esse modificador ao primeiro parâmetro de um método estático.

Para definir e chamar um método de extensão usando a sintaxe clássica:

  1. Defina uma classe estática para conter o método de extensão. A classe não pode ser aninhada dentro de outro tipo e deve estar visível para o código do 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 métodos de instância no tipo.

O exemplo a seguir implementa um método de extensão chamado WordCount usando a sintaxe clássica. O método opera na String classe, que é especificada como o primeiro parâmetro de método com o this modificador. O CustomExtensions namespace é importado para o namespace do aplicativo e o método é chamado como se fosse um método de instância na cadeia de caracteres.

using CustomExtensions;

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 {i}");


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 to be extended.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

Observação

O primeiro parâmetro não é especificado pelo código de chamada porque representa o tipo no qual o método 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.

Informações gerais

A resolução de sobrecarga prefere métodos estáticos ou de instância definidos pelo próprio tipo aos métodos de extensão. Os métodos de extensão não podem acessar nenhum dado particular na classe estendida.

Confira também