Как сохранить указатель на функцию в C # - PullRequest
19 голосов
/ 31 марта 2010

Допустим, я хочу сохранить группу указателей на функции в List<(*func)>, а затем вызвать их, возможно, даже с параметрами ... Как если бы я сохранял в Dict<(*func), object[] params>, я мог бы вызвать функцию с параметрами ? Как бы я это сделал?

Ответы [ 6 ]

34 голосов
/ 31 марта 2010

.NET использует делегаты вместо указателей функций. Вы можете сохранить экземпляр делегата, как и любой другой тип объекта, в словаре или иным способом.

См. Делегаты из Руководства по программированию в C # на MSDN.

22 голосов
/ 31 марта 2010

Вы можете иметь словарь функций:

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!";});

Затем вы можете вызвать методы следующим образом:

string s = functionList["firstFunction"].Invoke();
8 голосов
/ 31 марта 2010

Посмотрите на документацию C # по делегатам, которая является эквивалентом C # указателя на функцию (это может быть простой указатель на функцию или один раз карри для предоставления этого параметра). Существует много информации, которая будет вам полезна.

2 голосов
/ 31 марта 2010

Используйте ether делегат или событие (в зависимости от использования).

2 голосов
/ 31 марта 2010

Есть несколько способов сделать это. Вы могли бы сделать это так, как предлагали другие, используя делегатов. Но чтобы словарь заработал, им всем понадобится одна и та же подпись.

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

Или, если они имеют разные подписи, вы можете использовать метод реального отражения, например, следующий

var funcs = new Dictionary<MethodInfo, object[]>();
0 голосов
/ 21 июня 2013

Если вы храните только обработчики событий, тогда ...

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

...

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

Edit:

  • Я поместил это здесь, потому что я искал способ сделать что-то подобное, когда я нашел этот пост. Однако решения в этом посте не совсем сработали для моей ситуации, поэтому я решил поделиться тем, что сработало для меня.
...