2011-10-10 8 views
10

Zastanawiam się, czy można utworzyć tablicę lub listę <> która zawiera metody. Nie chcę używać przełącznika lub partii instrukcji if.Tablica zawierająca metody

Dzięki

+0

C# - patrz tytuł –

+0

możliwy duplikat [Jak przechowywać delegatów na liście] (http: // stackoverflow. com/questions/3813261/how-to-store-delegates-in-a-list) – xanatos

Odpowiedz

6

Tak, możliwe jest posiadanie takiej tablicy lub listy. W zależności od liczby parametrów wejściowych lub wyjściowych, można użyć czegoś podobnego

List<Func<T1, T2, TReturn>> 

Instancja typu Func<T1, T2, TReturn> jest metodą jak

TResult MyFunction(T1 input1, T2 input2) 

Take a look at the MSDN.

11

Nie idziesz

List<Action> list = new List<Action>(); 
list.Add(() => ClassA.MethodX(paramM)); 
list.Add(() => ClassB.MethodY(paramN, ...)); 

foreach (Action a in list) { 
    a.Invoke(); 
} 
+0

Dlaczego jest "Invoke()" tutaj? Nie możesz po prostu zrobić 'a()'? –

+1

@ Vilx - Tak, możesz użyć 'a()'. A do tego nie potrzebujesz ciężkiej "Listy ". Możesz wykonać 'new Action [] {() => MyMethod(),() => MyMethod2()};' –

+0

wyjaśnij, co masz na myśli ListT –

1

Jeśli próbujesz zastąpić przełącznik następnie słownik może być bardziej przydatny niż Lista

var methods = new Dictionary<string, Action>() 
       { 
        {"method1",() => method1() }, 
        {"method2",() => method2() } 
       }; 

methods["method2"](); 

Uważam to i switch zapach kodu i często mogą one być replaced by polymorphism.

+0

To zależy od tego, gdzie chcesz tego użyć. Co jeśli spróbujesz zaimplementować wzorzec poleceń? W takim przypadku jest w porządku. (lepiej też użyć listy) –

+0

Dlaczego lepiej użyć listy? –

+0

Ponieważ z wzorcem poleceń zwykle chcesz przechodzić przez wywołania zwrotne –

1

Może chcesz spróbować to jeśli u nie chcą korzystać z list

public Action[] methods; 

private void methodsInArray() 
{ 

    methods= new Action[2]; 
    methods[0] = test ; 
    methods[1] = test1; 
} 

private void test() 
{ 
    //your code 
} 

private void test1() 
{ 
    //your code 
} 
Powiązane problemy