Share via


How to: Implementar e chamar um método de extensão de Personalizar (guia de programação de C#)

Este tópico mostra como implementar seus próprios métodos de extensão para qualquer tipo na Biblioteca de classes .NET Framework, ou qualquer outro.NET que você deseja estender. O código de 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 especifica o namespace no qual os métodos de extensão são definidos.

A definição e chamada de 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 Access Modifiers (C# Programming Guide).

  2. Implementar o método de extensão como um método estático com pelo menos a mesma visibilidade como 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 namespace 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 é aplicado e que o compilador já sabe o tipo de seu objeto. Você só precisa fornecer argumentos para os parâmetros de 2 por meio de n.

Exemplo

O exemplo a seguir implementa um método de extensão chamado WordCount na MyExtensions.StringExtension classe. O método funciona com o String classe, que é especificado como o primeiro parâmetro do método. O MyExtensions namespace é importado para o namespace do aplicativo e o método é chamado dentro de 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 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 a diretiva para System. LINQ. Se um ou mais desses requisitos estiverem ausente 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 quaisquer dados particulares na classe estendida.

Consulte também

Referência

Métodos de extensão (guia de programação de C#)

Static Classes and Static Class Members (C# Programming Guide)

protected (C# Reference)

internal (C# Reference)

public (C# Reference)

Este (C# referência)

namespace (Referência de C#)

Conceitos

C# Programming Guide

Outros recursos

LINQ (consulta integrada à linguagem)