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
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
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)
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();
}
Dlaczego jest "Invoke()" tutaj? Nie możesz po prostu zrobić 'a()'? –
@ Vilx - Tak, możesz użyć 'a()'. A do tego nie potrzebujesz ciężkiej "Listy
wyjaśnij, co masz na myśli ListT –
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.
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) –
Dlaczego lepiej użyć listy? –
Ponieważ z wzorcem poleceń zwykle chcesz przechodzić przez wywołania zwrotne –
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
}
C# - patrz tytuł –
możliwy duplikat [Jak przechowywać delegatów na liście] (http: // stackoverflow. com/questions/3813261/how-to-store-delegates-in-a-list) – xanatos