Como: implementar e chamar um método de extensão personalizado (Guia de Programação em C#)How to: Implement and Call a Custom Extension Method (C# Programming Guide)

Este tópico mostra como implementar seus próprios métodos de extensão para qualquer tipo do .NET.This topic shows how to implement your own extension methods for any .NET type. 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.Client code can use your extension methods by adding a reference to the DLL that contains them, and adding a using directive that specifies the namespace in which the extension methods are defined.

Para definir e chamar o método de extensãoTo define and call the extension method

  1. Defina uma classe estática para conter o método de extensão.Define a static class to contain the extension method.

    A classe deve estar visível para o código de cliente.The class must be visible to client code. Para obter mais informações sobre regras de acessibilidade, consulte Modificadores de acesso.For more information about accessibility rules, see Access Modifiers.

  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.Implement the extension method as a static method with at least the same visibility as the containing class.

  3. O primeiro parâmetro do método especifica o tipo no qual o método opera. Ele deve ser precedido pelo modificador this.The first parameter of the method specifies the type that the method operates on; it must be preceded with the this modifier.

  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.In the calling code, add a using directive to specify the namespace that contains the extension method class.

  5. Chame os métodos como se fossem métodos de instância no tipo.Call the methods as if they were instance methods on the type.

    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.Note that the first parameter is not specified by calling code because it represents the type on which the operator is being applied, and the compiler already knows the type of your object. Você só precisa fornecer argumentos para os parâmetros de 2 até o n.You only have to provide arguments for parameters 2 through n.

ExemploExample

O exemplo a seguir implementa um método de extensão chamado WordCount na classe CustomExtensions.StringExtension.The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. O método funciona na classe String, que é especificada como o primeiro parâmetro do método.The method operates on the String class, which is specified as the first method parameter. O namespace CustomExtensions é importado para o namespace do aplicativo e o método é chamado dentro do método Main.The CustomExtensions namespace is imported into the application namespace, and the method is called inside the Main method.

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

Segurança do .NET Framework.NET Framework Security

Os métodos de extensão não apresentam nenhuma vulnerabilidade de segurança específica.Extension methods present no specific security vulnerabilities. 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.They can never be used to impersonate existing methods on a type, because all name collisions are resolved in favor of the instance or static method defined by the type itself. Os métodos de extensão não podem acessar nenhum dado particular na classe estendida.Extension methods cannot access any private data in the extended class.

Consulte tambémSee also