• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konkatenacja metody ze stringów - C#

Object Storage Arubacloud
+1 głos
395 wizyt
pytanie zadane 21 października 2021 w C# przez Kamirru9 Początkujący (300 p.)

Nie mogę skleić stringów w metodę.
Mam do wykonania 11 zadań i chciałem zastosować wywoływanie kolejnych zadań w pętli.

Próbowałem na różne sposoby z nawiasami itp.

Potrzebuję prostego rozwiązania.

Z góry dziękuję za pomoc :D

Na razie ustawiłem stałą liczbaZadan na 1 do testów, bo jeszcze nie dodałem kolejnych metod z2, z3..., z11.

const byte liczbaZadan = 1;
for (int i = 1; i <= liczbaZadan; i++)
{
    Console.WriteLine($"Zadanie nr.{i}");
    string z="z"+i.ToString();
    Zadania.z();
    //Console.WriteLine(z);
}
Console.ReadKey();

public class Zadania
{
    public void z1()
    {
        Console.WriteLine("rozwiązanie zadania 1");
    }
}

 

2 odpowiedzi

+3 głosów
odpowiedź 21 października 2021 przez draghan VIP (106,230 p.)

Nie da się ot tak po prostu skleić wywołania metody ze zmiennej typu `string` - przynajmniej nie w taki sposób. Do tego celu musisz użyć refleksji. Miej świadomość że to co próbujesz osiągnąć, nie jest uznawane za eleganckie - po refleksję należy sięgać kiedy nie ma innego sposobu, a nie kiedy chcesz po prostu wywołać znaną liczbę znanych metod. Ale w celach edukacyjnych można się tym pobawić. :)

Po pierwsze, metody które próbujesz wywołać, nie są statyczne, więc potrzebujesz instancji klasy `Zadania`, żeby móc na niej wywołać metody `z...`.

var instance = new Zadania();

Po drugie, musisz dostać obiekt opisujący daną metodę i wywołać na nim metodę `Invoke`, żeby po nazwie wywołać metodę dla danego obiektu.

instance.GetType().GetMethod(z).Invoke(instance, null);

https://docs.microsoft.com/en-us/dotnet/api/system.object.gettype?view=net-5.0

https://docs.microsoft.com/en-us/dotnet/api/system.type.getmethod?view=net-5.0

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodinfo?view=net-5.0

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodbase.invoke?view=net-5.0

komentarz 21 października 2021 przez Kamirru9 Początkujący (300 p.)

Dziękuję za odpowiedź :D
Jednak totalnie tego nie rozumiem :/
Nie da się tego zrobić prościej tak jak w PHP?
Albo tak abym to zrozumiał? 

Przykład z PHP: przykład

komentarz 21 października 2021 przez draghan VIP (106,230 p.)
Nie, nie da się tak jak w PHP - C# i PHP to są dwa zupełnie różne zwierzęta.

Żeby to zrobić w C#, musisz odpytać kompilator o metadane typu (`GetType`), wyciągnąć z nich metadane pożądanej metody (`GetMethod`) i dopiero próbować ją wywołać (`Invoke`).
komentarz 21 października 2021 przez Kamirru9 Początkujący (300 p.)
Swoją drogą nie dawno przesiadłem się na obiektowy C# z strukturalnego C++.
Dlaczego niestatyczna metoda nie działa z wywołania jej - Zadania.z1();                              Przecież ustawiłem i klasę i obiekt na public?
komentarz 21 października 2021 przez draghan VIP (106,230 p.)
Z definicji tylko metody statyczne możesz wołać bez obiektu, jedynie nazwą klasy. Metody niestatyczne potrzebują obiektu na którym zostaną wywołane.

Modyfikatory dostępu określają dla kogo dane składowe klasy (pola, metody, etc.) są widoczne.
0 głosów
odpowiedź 23 października 2021 przez everstudybee Użytkownik (610 p.)

Jestem początkujący i jeśli dobrze rozumiem, że ideą jest rozwiązanie x niezależnych zadań w jednym uruchomieniu programu, to ja bym to zrobił w ten sposób:

  1. Klasa Zadania jest statyczna, dzięki temu mogę wołać bezpośrednio jej metody.
  2. Potem zrobiłbym metodę w klasie Zadania do której mogę przekazać parametr int, który odpowiada za numer zadania i jest iterowany w pętli for na początku kodu.
  3. W klasie Zadania w metodzie RozwiazZadanie(int numerZadania) jest switch lub if, który wywołuje odpowiednią metodę rozwiązującą dane zadanie.

Czy to ma sens?

 

Podobne pytania

0 głosów
2 odpowiedzi 260 wizyt
pytanie zadane 19 lipca 2018 w C# przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 367 wizyt
pytanie zadane 10 czerwca 2018 w C# przez mpaw Użytkownik (580 p.)
0 głosów
2 odpowiedzi 989 wizyt
pytanie zadane 7 maja 2016 w PHP przez Filip31411 Dyskutant (8,820 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...