【问题标题】:How to store a function pointer in C#如何在 C# 中存储函数指针
【发布时间】:2011-02-02 18:15:20
【问题描述】:

假设我想将一组函数指针存储在List<(*func)> 中,然后稍后调用它们,甚至可以使用参数...就像我存储在Dict<(*func), object[] params> 中一样,我可以使用参数调用 func ?我该怎么做?

【问题讨论】:

  • Dict 看起来是个坏主意,但这只是我的想法。
  • 我用它来“切换”类型,使用类型作为键,函数作为代码。在“switch(typeof(string))”不会...的地方工作得很好

标签: c# .net function pointers


【解决方案1】:

.NET 使用委托而不是函数指针。您可以像任何其他类型的对象一样将委托实例存储在字典或其他方式中。

请参阅 MSDN 上 C# 编程指南中的 Delegates

【讨论】:

    【解决方案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's a string!";});
    

    然后您可以像这样调用方法:

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

    【讨论】:

    • 你也可以直接打电话给他们:functionList["firstFunction"]()
    【解决方案3】:

    查看关于委托的 C# 文档,它是函数指针的 C# 等价物(它可能是一个普通的函数指针或被柯里化一次以提供 this 参数)。有很多对您有用的信息。

    【讨论】:

    • 代表的哪些 C# 文档?链接会很有帮助。
    【解决方案4】:

    有几种方法可以做到这一点。您可以按照其他人的建议通过使用代表来做到这一点。但是要让字典正常工作,它们都需要相同的签名。

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

    或者如果他们有不同的签名,你可以使用实际的反射方法,如下所示

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

    【讨论】:

      【解决方案5】:

      使用 ether 作为委托或事件(取决于使用情况)。

      【讨论】:

      • 如何将事件存储在集合中?
      • @svick,事件属性有 get 和 set,它们有 add 和 remove,因为事件保留了处理程序列表。
      【解决方案6】:

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

      Dictionary<string, EventHandler> dictEvents = new Dictionary<string, EventHandler>();
      dictEvents.Add("Event1", someEventHandler);
      
      ...
      
      protected void someEventHandler(object sender, EventArgs e)
      {
         //Do something.
      }
      

      编辑:

      • 我把它放在这里是因为当我发现这篇文章时,我正在寻找一种方法来做类似的事情。但是,这篇文章中的解决方案并不完全适合我的情况,所以我想我会分享对我有用的方法。

      【讨论】:

      • 是什么让您认为问题与事件处理程序有关?
      猜你喜欢
      • 2019-02-03
      • 2020-08-21
      • 2022-11-17
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      相关资源
      最近更新 更多