Практическое руководство. Реализация и вызов пользовательского метода расширения (руководство по программированию на C#)How to implement and call a custom extension method (C# Programming Guide)

Этот раздел описывает, как реализовать свои методы расширения для любого типа .NET Framework.This topic shows how to implement your own extension methods for any .NET type. Клиентский код может использовать методы расширения путем добавления ссылки на содержащую их библиотеку DLL и добавления директивы using, которая указывает пространство имен, в котором определены методы расширения.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.

Определение и вызов метода расширенияTo define and call the extension method

  1. Определите статический класс, который будет содержать метод расширения.Define a static class to contain the extension method.

    Класс должен быть видимым для клиентского кода.The class must be visible to client code. Дополнительные сведения о правилах доступа см. в разделах Модификаторы доступа.For more information about accessibility rules, see Access Modifiers.

  2. Реализуйте метод расширения как статический метод как минимум с тем же уровнем видимости, что и содержащий класс.Implement the extension method as a static method with at least the same visibility as the containing class.

  3. Первый параметр метода указывает тип, с которым работает метод. Ему должен предшествовать модификатор this.The first parameter of the method specifies the type that the method operates on; it must be preceded with the this modifier.

  4. В вызывающем коде добавьте директиву using, чтобы задать пространство имен, содержащее класс метода расширения.In the calling code, add a using directive to specify the namespace that contains the extension method class.

  5. Вызовите методы, как если бы они являлись методами экземпляра для типа.Call the methods as if they were instance methods on the type.

    Обратите внимание, что первый параметр не указан вызывающим кодом, поскольку он представляет тип, к которому применяется оператор, и компилятору уже известен тип объекта.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. Вам необходимо предоставить аргументы только для параметров со 2 по n.You only have to provide arguments for parameters 2 through n.

ПримерExample

В приведенном ниже примере реализуется метод расширения с именем WordCount в классе CustomExtensions.StringExtension.The following example implements an extension method named WordCount in the CustomExtensions.StringExtension class. Метод работает с классом String класса, который указан как первый параметр метода.The method operates on the String class, which is specified as the first method parameter. Пространство имен CustomExtensions импортируется в пространство имен приложения, и метод вызывается внутри метода 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);
        }
    }
}

Безопасность .NET.NET Security

Методы расширения не предоставляют определенных уязвимостей безопасности.Extension methods present no specific security vulnerabilities. Они не могут использоваться для олицетворения существующих методов для типа, поскольку все конфликты имен разрешаются в пользу метода экземпляра или статического метода, определяемого самим типом.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. Методы расширения не могут получить доступ к любым конфиденциальным данным в расширенном классе.Extension methods cannot access any private data in the extended class.

См. такжеSee also