Czy do klasy można zastosować metody rozszerzające?
Na przykład rozszerz DateTime, aby uwzględnić metodę Tomorrow (), którą można wywołać, na przykład:
DateTime.Tomorrow();
Wiem, że mogę użyć
static DateTime Tomorrow(this Datetime value) { //... }
Lub
public static MyClass {
public static Tomorrow() { //... }
}
dla podobnego wyniku, ale jak mogę przedłużyć DateTime, aby móc wywołać DateTime.Tomorrow?
c#
extension-methods
David Glenn
źródło
źródło
Użyj metody rozszerzenia .
Dawny:
Stosowanie:
lub
źródło
DateTime.Tomorrow()
ponieważ metody rozszerzające działają tylko na INSTANCJACH klasy i jej struktury. Aby „rozszerzyć” statyczną metodę w strukturze klasy, postępuj zgodnie z odpowiedzią Andrew lub odpowiedzią Shuggy'ego .Metody rozszerzające są lukrem składniowym służącym do tworzenia metod statycznych, których pierwszy parametr jest instancją typu T, tak, jakby były metodą instancji w T.
W związku z tym korzyść jest w dużej mierze utracona, gdy tworzysz `` statyczne metody rozszerzające '', ponieważ mogłyby one zmylić czytelnika kodu nawet bardziej niż metoda rozszerzająca (ponieważ wydają się w pełni kwalifikowane, ale nie są w rzeczywistości zdefiniowane w tej klasie) bez zysku syntaktycznego (na przykład możliwość łączenia połączeń w płynny styl w Linq).
Ponieważ i tak musiałbyś wprowadzić rozszerzenia do zakresu za pomocą using, argumentowałbym, że tworzenie jest prostsze i bezpieczniejsze:
A następnie użyj tego w swoim kodzie poprzez:
źródło
Odpowiedź jest najbliższa przez dodanie metody rozszerzającej do
System.Type
obiektu. Niezbyt ładne, ale wciąż interesujące.W przeciwnym razie IMO Andrew i ShuggyCoUk mają lepszą implementację.
źródło
Type
można zastąpić innym wymaganym typem. Używam goFrom
i działa doskonale. więc myślę, że ta odpowiedź jest ogólna, ale poprawnaZrobiłbym to samo co Kumu
ale nazwij to nową DateTime (). Tomorrow ();
Myślę, że robi więcej seansów niż DateTime.Now.Tomorrow ();
źródło
Zapewniają możliwość rozszerzania istniejących typów poprzez dodawanie nowych metod bez konieczności modyfikowania typu. Wywoływanie metod z obiektów typu rozszerzonego w aplikacji przy użyciu składni metody instancji jest nazywane metodami „rozszerzającymi”. Metody rozszerzające nie są członkami instancji w typie. Kluczową kwestią do zapamiętania jest to, że metody rozszerzające, zdefiniowane jako metody statyczne, znajdują się w zakresie tylko wtedy, gdy przestrzeń nazw jest jawnie importowana do kodu źródłowego aplikacji za pośrednictwem dyrektywy using. Mimo że metody rozszerzające są zdefiniowane jako metody statyczne, nadal są wywoływane przy użyciu składni wystąpienia.
Sprawdź pełny przykład tutaj http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201
Przykład:
źródło
Szukałem czegoś podobnego - listy ograniczeń dla klas, które zapewniają metody rozszerzające. Wydaje się, że trudno jest znaleźć zwięzłą listę, więc oto:
Nie możesz mieć niczego prywatnego ani chronionego - pól, metod itp.
Musi to być klasa statyczna, jak w
public static class...
.W klasie mogą znajdować się tylko metody i wszystkie muszą być public static.
Nie możesz mieć konwencjonalnych metod statycznych - te, które nie zawierają argumentu this, nie są dozwolone.
Wszystkie metody muszą się rozpocząć:
public static ReturnType MethodName (this ClassName _this, ...)
Zatem pierwszym argumentem jest zawsze to odniesienie.
Stwarza to ukryty problem - jeśli dodasz metody, które wymagają jakiegokolwiek rodzaju blokady, nie możesz tak naprawdę zapewnić jej na poziomie klasy. Zwykle zapewniasz blokadę na poziomie instancji prywatnej, ale nie jest możliwe dodanie żadnych pól prywatnych, co pozostawia kilka bardzo niewygodnych opcji, takich jak udostępnienie go jako publicznego statycznego na niektórych zewnętrznych klasach itp. Jest ryzykowny. Znaki, że język C # miał zły obrót w ich projektowaniu .
Obejściem problemu jest użycie klasy Extension Method jako fasady dla zwykłej klasy, a wszystkie statyczne metody w klasie Extension po prostu wywołują prawdziwą klasę, prawdopodobnie używając Singletona .
źródło
Niestety nie możesz tego zrobić. Uważam jednak, że byłoby to przydatne. Bardziej naturalne jest pisanie:
niż:
W przypadku klasy Util należy sprawdzić, czy istnieje metoda statyczna w dwóch różnych klasach, a nie w jednej.
źródło
Ulepszyliśmy naszą odpowiedź o szczegółowe wyjaśnienie, teraz łatwiej jest zrozumieć metodę rozszerzenia
Metoda rozszerzenia : jest to mechanizm, za pomocą którego możemy rozszerzyć zachowanie istniejącej klasy bez używania podklasy lub modyfikowania lub rekompilowania oryginalnej klasy lub struktury.
Możemy rozszerzyć nasze niestandardowe klasy, klasy frameworków .net itp.
Metoda rozszerzająca jest w rzeczywistości specjalnym rodzajem metody statycznej zdefiniowanej w klasie statycznej.
Ponieważ
DateTime
klasa jest już zajęta powyżej i dlatego nie wzięliśmy tej klasy jako wyjaśnienia.Poniżej przykład
// To jest istniejąca klasa kalkulatora, która ma tylko jedną metodę (Dodaj)
źródło