Скажем, я хочу сохранить группу указателей функций в List<(*func)>
, а затем вызывать их позже, возможно даже с параметрами... Как если бы я сохранил в Dict<(*func), object[] params>
, я мог бы вызвать func с параметрами? Как мне это сделать?
Как сохранить указатель на функции в С#
Ответ 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:
- Я поставил это здесь, потому что я искал способ сделать что-то подобное, когда нашел этот пост. Тем не менее, решения в этой статье не совсем работали для моей ситуации, поэтому я решил, что буду делиться тем, что для меня работало.