Ответ 1
.NET использует делегаты вместо указателей на функции. Вы можете хранить экземпляр делегата, как любой другой вид объекта, в словаре или иначе.
См. Делегаты из руководства по программированию на С# в MSDN.
Скажем, я хочу сохранить группу указателей функций в List<(*func)>
, а затем вызывать их позже, возможно даже с параметрами... Как если бы я сохранил в Dict<(*func), object[] params>
, я мог бы вызвать func с параметрами? Как мне это сделать?
.NET использует делегаты вместо указателей на функции. Вы можете хранить экземпляр делегата, как любой другой вид объекта, в словаре или иначе.
См. Делегаты из руководства по программированию на С# в MSDN.
Вы можете абсолютно иметь словарь функций:
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();
Посмотрите на документацию С# на делегатах, которая является эквивалентом С# указателя на функцию (он может быть простым указателем функции или быть установленным один раз для подачи этого параметра). Существует много информации, которая будет вам полезна.
Есть несколько способов сделать это. Вы могли бы сделать это, как предложили другие, используя делегатов. Но чтобы заставить словарь работать, все они нуждаются в одной и той же сигнатуре.
var funcs = new Dictionary<Action<object[]>, object[]>();
Или, если у них есть разные подписи, вы можете использовать фактический отраженный метод, например следующий
var funcs = new Dictionary<MethodInfo, object[]>();
Используйте эфир делегат или событие (в зависимости от использования).
Если вы только сохраняете обработчики событий, тогда...
Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>();
dictEvents.Add("Event1", someEventHandler);
...
protected void someEventHandler(object sender, EventArgs e)
{
//Do something.
}
Edit: