gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:34:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com