Jak implementovat a volat vlastní metodu rozšíření (Průvodce programováním v C#)
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í.
Definování a volání metody 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 najdete v tématu Modifikátory accessu.
- 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í být předcházet s tímto modifikátorem.
- Do volajícího kódu přidejte direktivu
using
pro určení oboru názvů , který obsahuje třídu metody rozšíření. - Volejte metody jako metody instance pro typ.
Poznámka:
První parametr není určen voláním kódu, protože představuje typ, na kterém se operátor používá, a kompilátor již zná typ objektu. Argumenty parametrů 2 až n
.
Následující příklad implementuje rozšiřující metodu pojmenovanou WordCount
CustomExtensions.StringExtension
ve třídě. Metoda pracuje s String třídou, která je určena jako první parametr metody. Obor CustomExtensions
názvů se naimportuje do oboru názvů aplikace a metoda se volá uvnitř Main
metody.
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 {0}", 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 for which the method is defined.
public static int WordCount(this string str)
{
return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
Rozlišení přetížení upřednostňuje instanci nebo statickou metodu definovanou 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ě.