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
@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
@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 jakbym
@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ć.
@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
@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.
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 :)
@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 i
@Yahoo_: Bo to jest drzewo. Tylko że każdy kolejny poziom to inny rodzaj tej samej klasy (np. inne wymiary, inny kolor tła, inna czcionka - tego typu rzeczy). No może się to wydawać nieco dziwne, ale myśląc nad tym od kilku dni nie przychodzi mi nic bardziej user-friendly i minimalizującego robotę na przyszłość. Obecnie te Excele są hardkodowane w obleśnych ścianach kodu - więc jak ktoś by chciał dodać kolumnę pomiędzy
@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.
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.
@Yahoo_: Tak, bo alternatywą jest totalny hardcode każdej komórki formularza ( ͡º ͜ʖ͡º) Więc albo robię mechanizm taki jak robię - i tworzę sobie nową klasę w której wszystko ustawiam, wciskam tę klasę pomiędzy inne klasy w kolejce do kreacji - i bum, samo się robi, albo kodzisz Range("A1:A3").Merge.Value = "Zabijcie mnie" etc. tworząc makabryczną, sztywną ścianę kodu, którą trzeba modyfikować CAŁĄ za każdą zmianą w