2014-05-02 9 views
14

Próbuję utworzyć listę zawierającą metody, a po dodaniu niektórych metod chcę je wykonać, czy jest to możliwe?Jak utworzyć listę metod, a następnie wykonać je?

Próbowałem coś takiego:

List<object> methods = new List<object>(); 

wówczas:

methods.Add(Move()); 

ale gdy dodać, program będzie wywoływać metody, na przykład, w tym przypadku o nazwie dla Move();

Odpowiedz

20

Jest to doskonały przypadek użycia dla delegata generycznego Action.

List<Action> functions = new List<Action>(); 
functions.Add(Move); 

foreach (Action func in functions) 
    func(); 

Jeśli potrzebujesz parametry, użyłbym lambdy do abstrakcyjnego nich z dala:

List<Action> functions = new List<Action>(); 
functions.Add(Move); 
functions.Add(() => MoveTo(1, 5)); 

foreach (Action func in functions) 
    func(); 

Delegat jest zbliżona do wskaźników funkcji z C++, że posiada co funkcja „jest” (nie powrót wartość jak w twoim przykładzie), więc możesz nazwać to tak jak zwykłą funkcję. Delegat generyczny akcji nie przyjmuje żadnych parametrów i niczego nie zwraca, więc jest idealny do generycznego "wywoływania tych funkcji".

MSDN do działania: Action Delegate

+0

dziękuję !! Jego działa dobrze teraz (: – user3491915

+0

robi '' Lista niezbędnych Wydaje się po prostu definiowanie 'Action yourFunction;' i dołączenie? metody to działa przez '+ =' im, tak jak to 'yourFunction + = DoThis; yourFunction + = DoThat;'. Tylko upadek, nie jestem do końca pewien, jak iteruje to wewnętrznie, więc jeśli potrzebujesz tego poziomu kontroli Lista może być bardziej odpowiednia – bigp

+0

@bigp Możesz to zrobić, ponieważ wszyscy delegaci są multiemisją Ja osobiście lubię być tutaj wprost, jeśli chcę użyć + = Po prostu skorzystam z wydarzenia. rzecz jednak – BradleyDotNET

1

Możesz używać delegatów. Utwórz listę delegatów. Następnie dla każdej metody, którą chcesz dodać do listy, utwórz delegata i dodaj do listy.

List<Delegate> methods = new List<Delegate>(); 

// creates an Action delegate implicitly 
methods.Add((Action)Move); 
+0

Dzięki za uwagę (: – user3491915

Powiązane problemy