Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как реализовать собственные методы расширения для любого типа .NET. Клиентский код может использовать ваши методы расширения. Клиентские проекты должны ссылаться на сборку, содержащую их. Клиентские проекты должны добавить директиву using , указывающую пространство имен, в котором определены методы расширения.
Начиная с C# 14, существует два синтаксиса, которые можно использовать для определения методов расширения. C# 14 добавляет блоки расширения, в которых определяются члены расширения для типа. Перед C# 14 добавьте этот модификатор в первый параметр статического метода, чтобы указать, что метод отображается как член экземпляра типа параметра.
Блоки расширения (C# 14 и более поздних версий)
Начиная с C# 14, можно объявить методы расширения с помощью блоков расширения. Блок расширения — это блок в невложенном, не универсальном, статичном классе, который содержит члены расширения для типа или экземпляра этого типа.
Определение и вызов метода расширения с помощью блоков расширений:
- Определите статический класс, который будет содержать метод расширения. Класс не может быть вложен в другой тип и должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступа см. в разделах Модификаторы доступа.
- Используйте блок расширения для объявления членов расширения для типа.
- В вызывающем коде добавьте директиву
using, чтобы задать пространство имен, содержащее класс метода расширения. - Вызовите методы в качестве методов экземпляра в типе.
В следующем примере реализуется метод расширения с именем WordCount с использованием синтаксиса блока расширения C# 14. Метод работает с классом String . Пространство CustomExtensions имен импортируется в пространство имен приложения, и метод вызывается так, как если бы он был методом экземпляра в строке.
using CustomExtensions;
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 {i}");
namespace CustomExtensions
{
// Extension methods must be defined in a static class.
public static class StringExtension
{
extension(string str)
{
// This is the extension member.
// The `str` parameter is declared on the extension declaration.
public int WordCount()
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
}
Методы расширения (более ранние версии)
Перед C# 14 вы объявляете метод расширения, добавив этот модификатор в первый параметр статического метода.
Чтобы определить и вызвать метод расширения с помощью классического синтаксиса:
- Определите статический класс, который будет содержать метод расширения. Класс не может быть вложен в другой тип и должен быть видимым для клиентского кода. Дополнительные сведения о правилах доступа см. в разделах Модификаторы доступа.
- Реализуйте метод расширения как статический метод как минимум с тем же уровнем видимости, что и содержащий класс.
- Первый параметр метода указывает тип, с которым работает метод. Ему должен предшествовать модификатор this.
- В вызывающем коде добавьте директиву
using, чтобы задать пространство имен, содержащее класс метода расширения. - Вызовите методы в качестве методов экземпляра в типе.
В следующем примере реализуется метод расширения с именем WordCount с помощью классического синтаксиса. Метод работает с классом String , который указывается в качестве первого параметра метода с модификатором this . Пространство CustomExtensions имен импортируется в пространство имен приложения, и метод вызывается так, как если бы он был методом экземпляра в строке.
using CustomExtensions;
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 {i}");
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 to be extended.
public static int WordCount(this string str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
Примечание.
Первый параметр не указан путем вызова кода, так как представляет тип, к которому применяется метод, и компилятор уже знает тип объекта. Вам необходимо предоставить аргументы только для параметров со 2 по n.
Общая информация
Разрешение перегрузки предпочитает экземплярные или статические методы, определенные самим типом, по сравнению с методами расширения. Методы расширения не могут получить доступ к частным данным в расширенном классе.