c# - 如何使用集合来存储委托(delegate)?

标签 c# delegates

我想要一个以字符串作为键、以函数指针(委托(delegate))作为值的哈希表。 给定基于字符串的命令,这种方式调用正确的例程。 但是,编译器不会吃掉它。

我做错了什么?

//declaration
     public delegate void categoryHandler(String request);     

//init code
     Hashtable categories = new Hashtable();
     categories.Add("campaigns", Campaigns.post);

//function call
     String category = "campaigns";
     categoryHandler handler = (categoryHandler) categories[category];
     if (handler != null)
     {
          handler(someString);
     }

//handler
     static public void post(String request)
     {
          ...
     }

我得到的错误是在我将函数放入哈希表的那一行: 错误 2 参数“2”:无法从“方法组”转换为“对象”

我希望这只是我忘记的一些语义问题... 但是,如果无法做到这一点...是否有另一种方法来获得某种基于字符串的跳转表?

最佳答案

问题是您使用的是 Hashtable这是弱类型的。编译器看到方法组(您要转换为委托(delegate)的方法的名称)但不知道您指的是什么委托(delegate)类型。

如果你想继续使用 Hashtable,你可以这样做:

categoryHandler handler = Campaigns.post;
categories.Add("campaigns", handler);

categories.Add("campaigns", new categoryHandler(Campaigns.post));

在这两种情况下,方法组都被转换为特定的委托(delegate)类型,所以没问题。

但是,更好的解决方案是使用 Dictionary<string, categoryHandler>首先——总是在你可以明智地这样做的地方使用强类型集合(几乎总是这样)。为了约定,应该是CategoryHandler顺便说一句 - 这是一种类型的名称。同样post应该是 Post .

然后调用它,你会使用:

 String category = "campaigns";
 CategoryHandler handler;
 if (categories.TryGetValue(category, out handler))
 {
     handler(someString);
 }

关于c# - 如何使用集合来存储委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1439064/

相关文章:

c# - ODBC 连接到 Excel 错误

许多 RaisePropertyChanged 上的 C# MVVM 无响应 UI

iphone - 将值传递给委托(delegate)方法

iphone - 在现有应用程序上构建登录

c# - 使用委托(delegate)在表单之间进行通信

ios - 动画委托(delegate)未转换为 Swift 3.0

c# - 如何保存和使用应用程序的窗口大小?

c# - 在 C# "DialPad.Designer.CS"页面中注册 KeyPress 事件方法

c# - MVVM ViewModel 级联属性

Objective-C 10.10 NSApplication 委托(delegate)无法调用委托(delegate)类中定义的方法