W niestatycznej metodzie, której mógłbym użyć this.GetType()
i zwróciłoby to Type
. Jak mogę uzyskać to samo Type
w metodzie statycznej? Oczywiście nie mogę po prostu pisać, typeof(ThisTypeName)
ponieważ ThisTypeName
jest znany tylko w środowisku wykonawczym. Dzięki!
c#
.net
types
static-methods
Yegor
źródło
źródło
Odpowiedzi:
Jeśli szukasz 1 wkładki, która jest odpowiednikiem
this.GetType()
dla metod statycznych, wypróbuj następujące rozwiązania.Chociaż jest to prawdopodobnie znacznie droższe niż samo używanie
typeof(TheTypeName)
.źródło
typeof(TheTypeName)
tak załatwić .Jest coś, czego inne odpowiedzi nie do końca wyjaśniły, a co jest istotne dla twojego pomysłu, który jest dostępny tylko w czasie wykonywania.
Jeśli używasz typu pochodnego do wykonania statycznego elementu członkowskiego, rzeczywista nazwa typu jest pomijana w pliku binarnym. Na przykład skompiluj ten kod:
Teraz użyj na nim ildasm ... zobaczysz, że wywołanie jest emitowane w następujący sposób:
Kompilator rozwiązał wywołanie
Encoding.GetEncoding
- nie ma już śladuUnicodeEncoding
. Obawiam się, że przez to twój pomysł na „obecny typ” jest bezsensowny.źródło
Innym rozwiązaniem jest użycie autoreferencyjnego typu
Następnie w klasie, która go dziedziczy, tworzę typ odwołujący się do siebie:
Teraz typ wywołania typeof (TSelfReferenceType) wewnątrz Parent pobierze i zwróci Type obiektu wywołującego bez potrzeby instancji.
-Obrabować
źródło
Nie możesz użyć
this
w metodzie statycznej, więc nie jest to możliwe bezpośrednio. Jeśli jednak potrzebujesz typu jakiegoś obiektu, po prostu wywołajGetType
go i nadajthis
instancji parametr, który musisz przekazać, np .:Wygląda to jednak na kiepski projekt. Czy na pewno chcesz uzyskać typ samej instancji w jej własnej metodzie statycznej? Wydaje się to trochę dziwne. Dlaczego nie skorzystać po prostu z metody instancji?
źródło
Nie rozumiem, dlaczego nie możesz użyć typeof (ThisTypeName). Jeśli to nie jest typ ogólny, to powinno działać:
Jeśli jest to typ ogólny, to:
Czy brakuje mi czegoś oczywistego?
źródło
Kiedy Twój element członkowski jest statyczny, zawsze będziesz wiedział, jakiego typu jest częścią w czasie wykonywania. W tym przypadku:
Nie możesz zadzwonić (edytuj: najwyraźniej możesz, zobacz komentarz poniżej, ale nadal dzwoniłbyś do A):
ponieważ element członkowski jest statyczny, nie odgrywa roli w scenariuszach dziedziczenia. Ergo, zawsze wiesz, że typ to A.
źródło
Dla moich celów podoba mi się pomysł @ T-moty. Mimo że od lat korzystam z informacji o „typach odwołań do samych siebie”, późniejsze odniesienie do klasy bazowej jest trudniejsze.
Na przykład (używając przykładu @Rob Leclerc z góry):
Na przykład praca z tym wzorcem może być trudna; jak zwrócić klasę bazową z wywołania funkcji?
Albo podczas castingu?
Dlatego staram się tego unikać, kiedy mogę, i używać tego, kiedy muszę. Jeśli musisz, proponuję postępować zgodnie z tym wzorem:
Teraz możesz (bardziej) łatwiej pracować z
BaseClass
. Jednak są chwile, tak jak moja obecna sytuacja, kiedy ujawnianie klasy pochodnej z klasy bazowej nie jest potrzebne i użycie sugestii @ M-moty może być właściwym podejściem.Jednak użycie kodu @ M-moty działa tylko wtedy, gdy klasa bazowa nie zawiera żadnych konstruktorów instancji na stosie wywołań. Niestety moje klasy bazowe używają konstruktorów instancji.
Dlatego oto moja metoda rozszerzenia uwzględniająca konstruktory instancji klasy bazowej:
źródło
EDYTUJ Te metody będą działać tylko wtedy, gdy wdrażasz pliki PDB z plikiem wykonywalnym / biblioteką, jak wskazał mi markmnl .
W przeciwnym razie będzie poważny problem do wykrycia: działa dobrze w fazie rozwoju, ale może nie w produkcji.
Metoda narzędziowa, po prostu wywołaj ją, kiedy potrzebujesz, z każdego miejsca kodu:
źródło