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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
650 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 (670 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 369 wizyt
pytanie zadane 19 lipca 2018 w C# przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 442 wizyt
pytanie zadane 10 czerwca 2018 w C# przez mpaw Użytkownik (580 p.)
0 głosów
2 odpowiedzi 1,262 wizyt
pytanie zadane 7 maja 2016 w PHP przez Filip2248 Dyskutant (8,840 p.)

93,176 zapytań

142,187 odpowiedzi

321,982 komentarzy

62,508 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1614p. - Łukasz Piwowar
  3. 1599p. - CC PL
  4. 1597p. - Łukasz Eckert
  5. 1572p. - Tomasz Bielak
  6. 1545p. - Michal Drewniak
  7. 1537p. - Łukasz Siedlecki
  8. 1531p. - rucin93
  9. 1509p. - rafalszastok
  10. 1506p. - Marcin Putra
  11. 1380p. - Adrian Wieprzkowicz
  12. 1356p. - ssynowiec
  13. 1341p. - Mikbac
  14. 1169p. - Grzegorz Aleksander Klementowski
  15. 1155p. - Piotr Aleksandrowicz
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...