我希望有一个哈希表,其中字符串为键,而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':无法从'方法组'转换为'对象'
我希望它只是一些语义上的东西我忘记了......但如果不能这样做......还有另一种方法来获得某种基于字符串的跳转表吗?
问题是你使用的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)