Как удалось добавить метод к библиотечному классу без наследования?

В C# есть два способа добавить метод к библиотечному классу без наследования: с помощью extension-методов и с помощью применения декоратора.

Расширение класса с помощью extension-методов позволяет добавить новый метод в уже существующий класс, не изменяя сам класс. Для создания extension-метода необходимо создать статический класс, содержащий статический метод с ключевым словом "this" в качестве первого параметра. Этот параметр обозначает, к какому типу данных будет применяться extension-метод.

Пример:

public static class StringExtensions
{
    public static string Reverse(this string str)
    {
        char[] charArray = str.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }
}

В данном примере мы расширяем класс string и добавляем метод Reverse, который позволяет перевернуть строку.

Для использования extension-метода необходимо импортировать пространство имен, содержащее статический класс, и вызвать extension-метод, как если бы он был частью класса, к которому он был добавлен.

using StringExtensions;

string testString = "Hello World!";
string reversedString = testString.Reverse();
Console.WriteLine(reversedString);
// Output: "!dlroW olleH"

Методы можно добавить к библиотечному классу с помощью применения декоратора Extension. Декоратор Extension позволяет добавлять новые методы к существующим классам без необходимости изменять исходный код класса. Для применения декоратора Extension необходимо создать статический класс с статическим методом и пометить его атрибутом Extension. Первый параметр метода должен представлять тип, к которому метод будет применяться. Обратите внимание, что в данном случае сам класс не изменяется, и метод вызывается таким же образом, как обычный статический метод.

Пример:

public static class StringExtensions
{
    [Extension]
    public static string Reverse(string str)
    {
        char[] charArray = str.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }
}

Для использования метода, добавленного с использованием декоратора Extension, необходимо импортировать пространство имен, содержащее статический класс, и вызвать метод, как обычный статический метод.

using StringExtensions;

string testString = "Hello World!";
string reversedString = StringExtensions.Reverse(testString);
Console.WriteLine(reversedString);
// Output: "!dlroW olleH"

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