如何在C#中存储函数指针

19

假设我想要将一组函数指针存储在 List<(*func)> 中,然后稍后调用它们,甚至可能带有参数... 例如如果我将其存储在 Dict<(*func), object[] params> 中,我能否使用这些参数调用该函数?如何实现?


3
Dict<(*func), object[] params> 看起来不是一个好主意,但这只是我的看法。 - Jon Limjap
我使用它来“切换”类型,以类型作为键和函数作为代码。在“switch(typeof(string))”无法正常工作的情况下非常有效... - Dave Swersky
6个回答

35

.NET使用委托(delegates)而非函数指针。你可以像存储其他类型对象一样,将委托实例存储在字典或其他位置中。

请参阅MSDN上的C#编程指南中的“委托”章节。


22
你绝对可以拥有一个函数字典:
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();

12
您也可以直接调用它们:functionList["firstFunction"]() - Sam Harwell

8
请查看 C# 委托文档,它是函数指针的 C# 等效物(可能是普通函数指针或柯里化一次以提供 this 参数)。这里有很多对你有用的信息。

3
哪些关于委托的C#文档?提供链接会很有帮助。 - sblom

2

有几种方法可以做到这一点。您可以像其他人建议的那样通过使用委托来实现。但是,为了使字典正常工作,它们都需要具有相同的签名。

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

如果它们具有不同的签名,您可以使用实际反射方法,如下所示。
var funcs = new Dictionary<MethodInfo, object[]>();

2
请使用委托或事件(根据用途而定)。

你如何将事件存储在集合中? - svick
@svick,事件属性没有get和set,它们有add和remove,因为事件保持处理程序列表。 - Danny Varod

-1

如果你只是存储事件处理程序,那么...

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

...

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

编辑:

  • 我把这个放在这里是因为当我搜索类似的东西时,发现了这篇文章。然而,这篇文章中的解决方案并不完全适用于我的情况,所以我想分享一下对我有用的方法。

你为什么认为这个问题与事件处理程序有关? - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接