Практическое руководство. Реализация и вызов пользовательского метода расширения (Руководство по программированию в C#)
В этом разделе показано, как реализовать собственные методы расширения для любого типа в Библиотека классов .NET Frameworkили любой другой тип .NET, который требуется расширить. Клиентский код может использовать собственные методы расширения путем добавления ссылки на библиотеку DLL с этими методами, и добавления директивы using, определяющей пространство имен, в котором определены методы расширения.
Определение и вызов метода расширения
Определите статический класс, который будет содержать метод расширения.
Класс должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступности см. в разделе Модификаторы доступа (Руководство по программированию в C#).
Реализуйте метод расширения в качестве статического метода, обладающего, по меньшей мере, такой же видимостью, что и содержащий класс.
Первый параметр метода определяет тип, с которым метод выполняет операции; ему должен предшествовать модификатор this.
В вызывающем коде добавьте директиву using, чтобы указать пространство имен с классом метода расширения.
Вызовите методы, как если бы они были методами экземпляра в типе.
Обратите внимание, что первый параметр не указывается вызывающим кодом, так как представляет тип, к которому применяется оператор, и компилятору уже известен тип объекта. Аргументы нужно указать только для параметров со 2 по n.
Пример
Следующий пример реализует метод расширения с именем WordCount в классе CustomExtensions.StringExtension. Метод выполняет операции с классом String, указанным в первом параметре метода. Пространство имен CustomExtensions импортируется в пространство имен приложения, и метод вызывается внутри метода 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#