Delegaty i nazwy funkcji jako string

0

Witam,
mam taki oto problem, właśnie pracuję testowo nad małą gierką, będzie to gra turowa, bardziej robię to w celu ćwiczenia programowania niż na jej wydanie. Natchnąłem się na jeden problem, zrobiłem edytor mapy, który to zapisuje to xml'a nazwę lokacji i jej opis, gdzie można przejść dalej, napotkane na lokacji przedmioty i stworzenia itp. Chciałbym jeszcze dodać jedną opcję, aby na pewnych lokacjach była wywoływana pewna metoda klasy ale.. no właśnie nie chciałbym tego zaszywać w kodzie czyli np. jeśli lokacja to Las to metoda (LosujCzyNapadnaZbojnicy), a chciałbym to zrobić w edytorze mapy, aby wpisać jedynie nazwę metody (jako string), która by była odczytana z xml'a i następnie wywoływana. I tutaj problem, nie wiem jak stworzyć delegata (action) aby tę metodę przekazywać po nazwie. Oczywiście metody te są zdefiniowane w klasie, ale chciałbym ominąć szereg instrukcji warunkowych, które by wywoływały, która z metod ma zostać wywołana.
Zresztą możliwość stworzenia delegata na podstawie jedynie nazwy (string) metody da mi większe możliwości.

Z góry dzięki za wszelkie sugestie.

2

Słowo-klucz to “reflection”.
Ale nie wiem czy to dobry pomysł. Takie rzeczy robi się na enumie.

1

Może słownik? Robisz słownik wszytskich możliwych delegatów z twoim stringiem jako klucz.

Dictionary<string, Action> possibleActions;
possibleActions.Add("action name", (() => Console.WriteLine("Coś się dzieje")));
possibleActions["action name"].Invoke();
0

Dzięki, właściwie to nie pomyślałem o dictionary :) a niedawno na CodeWars właśnie tak interpreter robiłem, ale coś mnie przyćmiło.
Ale to czego szukałem to faktycznie reflection. BTW Azarien czemu myślisz, że to zły pomysł, pytam bo nie mam w tym praktyki a wydawało mi się to dobrym rozwiązaniem.

Dzięki.

0
Tomek napisał(a):

Dzięki, właściwie to nie pomyślałem o dictionary :) a niedawno na CodeWars właśnie tak interpreter robiłem, ale coś mnie przyćmiło.
Ale to czego szukałem to faktycznie reflection. BTW Azarien czemu myślisz, że to zły pomysł, pytam bo nie mam w tym praktyki a wydawało mi się to dobrym rozwiązaniem.

Dzięki.

To ja tylko niezalogowany :D

2

To zły pomysł bo jeśli jakimś dziwnym zbiegiem okoliczności będziesz miał metodę "NieOdwracalnieUszkodźMape", to zgodnie z prawem Murphy jej wywołanie jest tylko kwestią czasu. Można też próbować wykorzystać to do oszukiwania. Poza tym korzystanie z refleksji uzależnia Cie od nazw metod/zmiennych i drastycznie podnosi prawdopodobieństwo że aplikacja nagle przestanie działać w sumie nie wiadomo co dalej. Ogólnie refleksja to brudny hak którym można robić fajne rzeczy ale nacodzień lepiej go unikać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1