Compartilhar via


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 na .NET Framework Class Library, ou qualquer outro.NET que você deseja estender. Código do cliente pode usar os métodos de extensão, adicionando uma referência para a DLL que contém-los e adicionando um usando diretiva 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. Definir um estático classe para conter o método de extensão.

    A classe deve ser visível para o código do cliente. Para obter mais informações sobre regras de acessibilidade, consulte Modificadores de acesso (Guia de Programação em C#).

  2. Implementar o método de extensão como um método estático com pelo menos a mesma visibilidade que a classe continente.

  3. O primeiro parâmetro do método Especifica o tipo que o método opera em; ele deve ser precedido com o Este modificador.

  4. No código de chamada, adicionar um using a diretiva para especificar o espaço para nome que contém a classe do método de extensão.

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

    Observe que o primeiro parâmetro não for especificado, chamando código porque representa o tipo em que o operador está sendo aplicado e o compilador já sabe o tipo de seu objeto. Você só precisará fornecer argumentos para parâmetros 2 por meio de n.

Exemplo

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

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

Compilando o código

Para executar esse código, copie e cole-o em um Visual C# projeto de aplicativo console que tenha sido criado em Visual Studio. Por padrão, esse projeto destina-se a versão 3.5 da .NET Framework, e ele tem uma referência a System.Core.dll e um using diretriz para System. LINQ. Se um ou mais desses requisitos estão ausentes do projeto, você pode adicioná-los manualmente. Para obter mais informações, consulte Como criar um projeto LINQ.

Segurança

Métodos de extensão não apresentam nenhuma vulnerabilidade de segurança específicas. 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 definido pelo próprio tipo de método estático. Métodos de extensão não podem acessar todos os dados particulares na classe estendida.

Consulte também

Referência

Métodos de extensão (Guia de Programação em C#)

Classes static e membros de classes static (Guia de Programação em C#)

protected (Referência de C#)

internal (Referência de C#)

public (Referência de C#)

this (Referência de C#)

namespace (Referência de C#)

Conceitos

Guia de Programação em C#

Outros recursos

LINQ (Consulta Integrada à Linguagem)