Wpis z mikrobloga

#csharp #programowanie

Wołam @spetz , bo się zna ( ͡° ͜ʖ ͡°)

Problem mam następujący. Chcę mieć funkcję, która przyjmuje jako argument typy. Nie jest to żaden problem w C#, natomiast nie chce mi zatwierdzić tego gdy wpiszę samo Funcja (TypeName), musi być Funkcja(typeof(TypeName)). Da się to jakoś tak zrobić, żeby nie musieć pisać nic więcej niż sam typ?
  • 22
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@spetz: No właśnie problem w tym, że tak naprawdę to jest lista typów. Wszystkie te typy dziedziczą po jednej klasie i są jej wersją z nieco innymi parametrami. Więc konkretyzowanie jakiegoś szablonu nic mi tu nie uprości. Ta funkcja przyjmuje dowolną liczbę parametrów, więc może być równie dobrze:

Funkcja(typ1, typ2, typ3, typ4);

Natomiast ta funkcja jest właśnie między innymi od tego aby sobie te klasy po typach znaleźć, utworzyć ich instancje i
  • Odpowiedz
A nie chcę dawać stringów, bo utracę wtedy kontrolę nad typami - ktoś zrobi refactor i się wszystko posypie.


@Khaine: to użyj operatora nameof()
  • Odpowiedz
@Szab: Opisałem wyżej czemu mi to nic nie da ( ͡° ʖ̯ ͡°) To nie jest funkcja generic, ona ma przyjmować typy dziedziczące po jednym konkretnym typie (tak jak opisałem wyżej) - ale pisanie new Typ1() albo typeof(Typ1) to po prostu zbędne zaciemnianie kodu. Bo sama nazwa typu jest tutaj potrzebną informacją, nic więcej.

Najmniejszym złem jest używanie new Typ1() jak już. Ale idealnie by było
  • Odpowiedz
@Khaine: a może powiedz co chcesz zrobić? Bo to brzmi jakby było przekombinowane, może jest jakiś lepszy patern, żeby osiągnąć Twój cel? Generalnie C# jest językiem silnie typowanym i w 99% przypadków chcemy z tego korzystać.
  • Odpowiedz
@Yahoo_: dość spora - nameof generuje stringa. Ale generalnie po całym tym poście autor szuka dziury w całym i do tego jak użyje generyków to zrobi dużo mniej czytelny kod, tylko dlatego że mu się nie chce typeof napisać. Napisałby to 30 razy w czasie pisania tego posta
  • Odpowiedz
  • 0
@Khaine połączenie stringów i odporności na refactoring:

Metoda($"{Typ1} {Typ2} {Typ3}");
Osiągniesz to co chcesz (jeżeli dobrze rozumiem), choć wg mnie kod brzydki.
  • Odpowiedz
dość spora - nameof generuje stringa.

@piachu: no tym gorzej :D. typeof daje Ci typ, z którego możesz wyciągnąć stringa, ale też dużo innych rzeczy :).

Napisałby to 30 razy w czasie pisania tego posta


@piachu: kod piszesz raz, czytasz setki razy :)
  • Odpowiedz
@Yahoo_: Długo by pisać, raczej nie da się tego lepiej zrobić. To ma być samoorganizująca się kaskadowa struktura elementów wbijanych do arkuszy Excelowych (no bez wytłumaczenia dogłębnego nie idzie raczej wyjaśnić czemu akurat tak i po co).

Jedyna alternatywa od robienia osobnych klas dziedziczących po jakiejś defaultowej bazie to tworzenie instancji tej bazy o określonych przy tworzeniu parametrach - ale tego nie chcę, bo chcę aby wszystkie "bloczki" były generyczne
  • Odpowiedz
@Khaine: dobra nie wiem, brzmi dziwnie. Dziwne jest posiadanie klasy per wymiar, kolor tła, czcionka ;).
Wracając do oryginalnego pytania jeżeli potrzebujesz tylko typu użyj typeof, jeśli potrzebujesz instancji, użyj instancji. Niech Twoja metoda precyzyjnie mówi jakie typu argumenty są jej porzebne.
  • Odpowiedz
Dziwne jest posiadanie klasy per wymiar, kolor tła, czcionka ;).


@Yahoo_: Wiem, ale alternatywą są instancje - a wtedy musisz robić jakieś presety tak czy inaczej, więc już lepiej mieć to jako osobny typ.
  • Odpowiedz