Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek ukazuje, jak implementovat vlastní metody rozšíření pro libovolný typ .NET. Klientský kód může používat vaše rozšiřující metody. Klientské projekty musí odkazovat na sestavení, které je obsahuje. Klientské projekty musí přidat direktivu using , která určuje obor názvů, ve kterém jsou definovány metody rozšíření.
Počínaje jazykem C# 14 existují dvě syntaxe, které můžete použít k definování metod rozšíření. C# 14 přidá bloky rozšíření , kde definujete členy rozšíření pro typ. Před C# 14 přidáte tento modifikátor do prvního parametru statické metody, který indikuje, že metoda se zobrazí jako člen instance typu parametru.
Bloky rozšíření (C# 14 a novější)
Počínaje C# 14 můžete deklarovat rozšiřující metody pomocí bloků rozšíření. Blok rozšíření je blok v nenořené, ne generické statické třídě, která obsahuje členy rozšíření pro typ nebo instanci tohoto typu.
Definování a volání metody rozšíření pomocí bloků rozšíření:
- Definujte statickou třídu , která bude obsahovat rozšiřující metodu. Třídu nelze vnořit do jiného typu a musí být viditelná pro kód klienta. Další informace o pravidlech přístupnosti viz Modifikátory přístupu.
- K deklarování členů rozšíření pro typ použijte blok rozšíření .
- Do volajícího kódu přidejte direktivu
usingpro určení oboru názvů , který obsahuje třídu metody rozšíření. - Volejte metody jako instance metody daného typu.
Následující příklad implementuje metodu rozšíření pojmenovanou WordCount pomocí syntaxe bloku rozšíření C# 14. Metoda pracuje s String třídou. Obor CustomExtensions názvů se naimportuje do oboru názvů aplikace a metoda se volá, jako by se jednalo o metodu instance v řetězci.
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;
}
}
}
}
Metody rozšíření (starší verze)
Před C# 14 deklarujete rozšiřující metodu přidáním tohoto modifikátoru do prvního parametru statické metody.
Definování a volání metody rozšíření pomocí klasické syntaxe:
- Definujte statickou třídu , která bude obsahovat rozšiřující metodu. Třídu nelze vnořit do jiného typu a musí být viditelná pro kód klienta. Další informace o pravidlech přístupnosti viz Modifikátory přístupu.
- Implementujte metodu rozšíření jako statickou metodu s alespoň stejnou viditelností jako obsahující třídu.
- První parametr metody určuje typ, se kterým metoda pracuje; musí mu předcházet tímto modifikátorem.
- Do volajícího kódu přidejte direktivu
usingpro určení oboru názvů , který obsahuje třídu metody rozšíření. - Volejte metody jako instance metody daného typu.
Následující příklad implementuje metodu rozšíření pojmenovanou WordCount pomocí klasické syntaxe. Metoda pracuje s String třídou, která je určena jako první parametr metody s modifikátorem this . Obor CustomExtensions názvů se naimportuje do oboru názvů aplikace a metoda se volá, jako by se jednalo o metodu instance v řetězci.
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;
}
}
}
Poznámka:
První parametr není určen voláním kódu, protože představuje typ, na kterém se metoda používá, a kompilátor již zná typ objektu. Stačí poskytnout argumenty pro parametry 2 až n.
Obecné informace
Rozlišení přetížení dává přednost instancím nebo statickým metodám definovaným samotným typem před rozšiřujícími metodami. Rozšiřující metody nemají přístup k žádným soukromým datům v rozšířené třídě.