2010-03-31 14 views
18

Powiedzmy, że chcę zapisać grupę wskaźników funkcji w List<(*func)>, a następnie wywołać je, być może nawet z parametrami ... Tak jakbym zapisał w Dict<(*func), object[] params> mógłbym wywołać func z parametrami? Jak to zrobić?Jak zapisać wskaźnik funkcji w języku C#

+3

Dict <(* func), obiekty [] params> wygląda na kiepski pomysł, ale to tylko ja. –

+0

Używam go do "przełączania" typów, używając Type jako klucza i funkcji jako kodu. Działa świetnie, gdy "switch (typeof (string))" nie ... –

Odpowiedz

30

. NET używa delegatów zamiast wskaźników funkcji. Możesz przechowywać instancję delegata, jak każdy inny rodzaj obiektu, w słowniku lub w inny sposób.

Zobacz Delegates z Przewodnika po programowaniu C# na MSDN.

8

Przejrzyj dokumentację C# na delegatach, która jest równoważnikiem C# wskaźnika funkcji (może to być zwykły wskaźnik funkcji lub zostać przekartkowany raz, aby dostarczyć ten parametr). Jest wiele przydatnych informacji.

+2

Która dokumentacja C# na temat delegatów? Linki byłyby pomocne. – sblom

2

Istnieje kilka sposobów na zrobienie tego. Można to zrobić tak, jak sugerowali inni, korzystając z pomocy delegatów. Ale żeby słownik działał, wszyscy potrzebowaliby tego samego podpisu.

var funcs = new Dictionary<Action<object[]>, object[]>(); 

Albo jeśli mają różne podpisy można użyć rzeczywisty sposób odbity, jak na poniższym

var funcs = new Dictionary<MethodInfo, object[]>(); 
22

Możesz absolutnie mieć słownika funkcji:

Dictionary<string, Action<T>> actionList = new Dictionary<string, Action<T>>(); 
Dictionary<string, Func<string>> functionList = new Dictionary<string, Func<string>>(); 

actionList.Add("firstFunction",()=>{/*do something;*/}); 
functionList.Add("firstFunction",()=>{return "it's a string!";}); 

Następnie można wywołaj takie metody:

string s = functionList["firstFunction"].Invoke(); 
+8

Możesz również wywoływać je bezpośrednio: 'functionList [" firstFunction "]()' –

2

Użyj eteru delegata lub wydarzenia (w zależności od zastosowania).

+0

Jak zapisać wydarzenie w kolekcji? – svick

+0

@svick, właściwości zdarzenia puchują się i pobierają, dodają i usuwają, ponieważ zdarzenia przechowują listę procedur obsługi. –

-1

Jeśli przechowywania obsługi zdarzeń tylko wtedy ...

Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>(); 
dictEvents.Add("Event1", someEventHandler); 

... 

protected void someEventHandler(object sender, EventArgs e) 
{ 
    //Do something. 
} 

Edit:

  • Ja to tutaj, bo szukałem sposobu, aby zrobić coś podobnego, kiedy znalazłem ten post . Jednak rozwiązania tego posta nie działały w mojej sytuacji, więc pomyślałem, że podzielę się tym, co dla mnie działa.
+0

Co sprawia, że ​​pytanie dotyczy obsługi zdarzeń? – svick

Powiązane problemy