Поделиться через


Практическое руководство. Реализация и вызов пользовательского метода расширения (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

В этом разделе демонстрируется реализация собственных методов расширения для любого типа в Библиотека классов .NET Framework, или любого другого типа .NET Framework, который требуется расширить. Клиентский код может использовать собственные методы расширения путем добавления ссылки на библиотеку DLL с этими методами, и добавления директивы using, определяющей пространство имен, в котором определены методы расширения.

Определение и вызов метода расширения

  1. Определите статический класс, который будет содержать метод расширения.

    Класс должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступности см. в разделе Модификаторы доступа (Руководство по программированию в C#).

  2. Реализуйте метод расширения в качестве статического метода, обладающего, по меньшей мере, такой же видимостью, что и содержащий класс.

  3. Первый параметр метода определяет тип, с которым метод выполняет операции; ему должен предшествовать модификатор this.

  4. В вызывающем коде добавьте директиву using, чтобы указать пространство имен с классом метода расширения.

  5. Вызовите методы, как если бы они были методами экземпляра в типе.

    Обратите внимание, что первый параметр не указывается вызывающим кодом, так как представляет тип, к которому применяется оператор, и компилятору уже известен тип объекта. Аргументы нужно указать только для параметров со 2 по n.

Пример

Следующий пример реализует метод расширения с именем WordCount в классе MyExtensions.StringExtension. Метод выполняет операции с классом String, указанным в первом параметре метода. Пространство имен MyExtensions импортируется в пространство имен приложения, и метод вызывается внутри метода Main.

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

Компиляция кода

Для выполнения этого кода скопируйте его в проект консольного приложения на языке Visual C#, которое было создано в среде разработки Visual Studio. По умолчанию этот проект предназначен для версии 3.5 платформы .NET Framework и имеет ссылку на библиотеку System.Core.dll и директиву using для пространства имен System.Linq. Если одно или более требований в проекте отсутствуют, их можно добавить вручную. Дополнительные сведения см. в разделе Практическое руководство. Создание проекта LINQ.

Безопасность

Методы расширения не представляют определенных уязвимостей безопасности. Они ни в коем случае не могут использоваться для олицетворения существующих методов в типе, поскольку все конфликты имен разрешаются в пользу метода экземпляра или статического метода, определяемого самим типом. Методы расширения не могут обращаться к каким-либо закрытым данным в расширенном классе.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Методы расширения (руководство по программированию в C#)

Статические классы и члены статических классов (руководство по программированию в C#)

protected (справочник по C#)

internal (Справочник по C#)

public (справочник по C#)

this (Справочник по C#)

namespace (справочник по C#)

Другие ресурсы

LINQ