Подтвердить что ты не робот

Как сохранить указатель на функции в С#

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Или, если у них есть разные подписи, вы можете использовать фактический отраженный метод, например следующий

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

Ответ 5

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

Ответ 6

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

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

...

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

Edit:

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