Partilhar 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 .NET. O código do cliente pode usar seus métodos de extensão. Os projetos cliente devem fazer referência ao assembly que os contém. Os projetos cliente devem adicionar 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 não pode ser aninhada dentro de outro tipo e deve ser 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 que a classe que contém.
  3. O primeiro parâmetro do método especifica o tipo em que o método opera; deve ser precedido deste modificador.
  4. No código de chamada, adicione uma using diretiva para especificar o namespace que contém a classe do método extension.
  5. Chame os métodos como métodos de instância no tipo.

Nota

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

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

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 for which the method is defined.
        public static int WordCount(this string str)
        {
            return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}

A resolução de sobrecarga prefere instância ou método estático definido pelo próprio tipo a métodos de extensão. Os métodos de extensão não podem acessar nenhum dado privado na classe estendida.

Consulte também