如何使用集合来存储委托?

Toa*_*oad 3 c# delegates

我希望有一个哈希表,其中字符串为键,而functionpointer(委托)为值.这样在给定基于字符串的命令的情况下调用正确的例程 但是,编译器不会吃它.

我究竟做错了什么?

//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)
     {
          ...
     }
Run Code Online (Sandbox Code Playgroud)

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

我希望它只是一些语义上的东西我忘记了......但如果不能这样做......还有另一种方法来获得某种基于字符串的跳转表吗?

Jon*_*eet 8

问题是你使用的Hashtable是弱类型.编译器会看到方法组(要转换为委托的方法的名称),但不知道您所指的委托类型.

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

categoryHandler handler = Campaigns.post;
categories.Add("campaigns", handler);
Run Code Online (Sandbox Code Playgroud)

要么

categories.Add("campaigns", new categoryHandler(Campaigns.post));
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,方法组都被转换为特定的委托类型,所以没关系.

但是,更好的解决方案是首先使用Dictionary<string, categoryHandler>- 始终使用强类型集合,您可以明智地这样做(这几乎总是如此).为了惯例,它应该是CategoryHandlerbtw - 它是一个类型的名称.同样post应该Post.

然后打电话给你,你会用:

 String category = "campaigns";
 CategoryHandler handler;
 if (categories.TryGetValue(category, out handler))
 {
     handler(someString);
 }
Run Code Online (Sandbox Code Playgroud)