我想要一个以字符串作为键、以函数指针(委托(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/