• 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#

VPS Starter Arubacloud
+1 głos
381 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 255 wizyt
pytanie zadane 19 lipca 2018 w C# przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 10 czerwca 2018 w C# przez mpaw Użytkownik (580 p.)
0 głosów
2 odpowiedzi 937 wizyt
pytanie zadane 7 maja 2016 w PHP przez Filip31411 Dyskutant (8,820 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...