C#委托数组声明中定义的函数?
我正在为我的流制作一个IRC聊天机器人。我发现了一些使用C#的基本连接示例,所以我决定尝试一下 到目前为止,我喜欢它 但我被这一部分困住了 我想将bot命令存储在结构类型的数组中C#委托数组声明中定义的函数?,c#,C#,我正在为我的流制作一个IRC聊天机器人。我发现了一些使用C#的基本连接示例,所以我决定尝试一下 到目前为止,我喜欢它 但我被这一部分困住了 我想将bot命令存储在结构类型的数组中 public delegate void cmdHandler(string[]); struct botCommand { string name; cmdHandler chandler; bool isAdmin = false; string help = "Nothing h
public delegate void cmdHandler(string[]);
struct botCommand
{
string name;
cmdHandler chandler;
bool isAdmin = false;
string help = "Nothing here.";
}
是我目前所拥有的,然后我希望能够做到:
botCommand[]commands =
{
{ "TestCommand", testCommand(), 0, "Help for this" },
{ "TestCommand2", testCommand2(), 0 "..." },
......
};
那么我如何链接该数组中的泛型函数呢
还是我走错了路
基本上,我不想用一个巨大的Switch()语句来检查使用了哪个命令,而是想在数组中循环,看看命令是否在其中。如果是,则调用与该命令关联的函数
编辑:
这正是我现在所拥有的,所以你可以看到我正在努力做什么
public delegate void cmdHandler(string[] ex);
struct botCommand
{
string name;
cmdHandler chandler;
bool isAdmin = false;
string help = "Nothing here.";
}
botCommand[] commands =
{
{"test", new cmdHandler(testf), 0, "" }
};
public void testf(string[] ex) {
return;
}
逻辑步骤:
在我看来,您似乎将C/C++概念与C#混合在一起(使用struct而不是class,0表示false、对象初始值设定项等等) 要解决单个问题,必须以不同的方式实例化结构
botCommand[] commands = new []
{
new botCommand {
name = "Test",
chandler = new cmdHandler(MyMethod),
isAdmin = false,
help = "No help for you..."
}
};
其中MyMethod
定义为
public static void MyMethod(string[] myArgs)
{
//... do something ...
}
但是,我认为更好的方法是为单个命令、命令列表或命令字典提供一个抽象类/接口
public interface IBotCommand
{
string Name { get; }
bool IsAdmin { get; }
void Process(string[] args);
string HelpText { get; }
}
public class MyCommand : IBotCommand
{
string Name
{
get
{
return "NameOfTheCommand";
}
}
bool IsAdmin
{
get
{
return false;
}
}
void Process(string[] args)
{
// bla bla, im processing stuff
}
string HelpText
{
get
{
return "This is the help text";
}
}
}
然后使用它
List<IBotCommand> commands = new List<IBotCommand>();
commands.Add(new MyCommand());
// to find a command and execute it
IBotCommand cmdToExecute = commands.SingleOrDefault(c => c.Name == "NameOfTheCommand");
if (cmdToExecute != null)
{
cmdToExecute.Process(args); // where-ever args comes from
}
else
{
// unknown command "NameOfTheCommand"
}
List命令=新建列表();
Add(新的MyCommand());
//查找并执行命令的步骤
IBotCommand cmdToExecute=commands.SingleOrDefault(c=>c.Name==“命令名”);
如果(cmdToExecute!=null)
{
cmdToExecute.Process(args);//args来自何处
}
其他的
{
//未知命令“nameofcommand”
}
在我看来,您似乎将C/C++概念与C#混合在一起(使用struct而不是class,0表示false、对象初始值设定项等等)
要解决单个问题,必须以不同的方式实例化结构
botCommand[] commands = new []
{
new botCommand {
name = "Test",
chandler = new cmdHandler(MyMethod),
isAdmin = false,
help = "No help for you..."
}
};
其中MyMethod
定义为
public static void MyMethod(string[] myArgs)
{
//... do something ...
}
但是,我认为更好的方法是为单个命令、命令列表或命令字典提供一个抽象类/接口
public interface IBotCommand
{
string Name { get; }
bool IsAdmin { get; }
void Process(string[] args);
string HelpText { get; }
}
public class MyCommand : IBotCommand
{
string Name
{
get
{
return "NameOfTheCommand";
}
}
bool IsAdmin
{
get
{
return false;
}
}
void Process(string[] args)
{
// bla bla, im processing stuff
}
string HelpText
{
get
{
return "This is the help text";
}
}
}
然后使用它
List<IBotCommand> commands = new List<IBotCommand>();
commands.Add(new MyCommand());
// to find a command and execute it
IBotCommand cmdToExecute = commands.SingleOrDefault(c => c.Name == "NameOfTheCommand");
if (cmdToExecute != null)
{
cmdToExecute.Process(args); // where-ever args comes from
}
else
{
// unknown command "NameOfTheCommand"
}
List命令=新建列表();
Add(新的MyCommand());
//查找并执行命令的步骤
IBotCommand cmdToExecute=commands.SingleOrDefault(c=>c.Name==“命令名”);
如果(cmdToExecute!=null)
{
cmdToExecute.Process(args);//args来自何处
}
其他的
{
//未知命令“nameofcommand”
}
你不需要括号()
,除非该函数返回一个委托,但我怀疑你是否这样做了。哦,从周日开始我就一直在尝试。我需要知道如何从数组声明内部链接该函数。我需要语法!我在谷歌搜索了几个小时。但是我不熟悉C#testCommand
,testCommand2
是一个接受字符串数组的函数吗?不。我想要一个静态数组,它有一个命令列表,然后指向这些命令的函数。因此,如果有人使用命令“TestCommand”,我只需从结构中调用“chandler”委托。这有意义吗?您的testf
定义为什么?您不需要括号()
,除非该函数返回一个委托,但我怀疑您是否在这样做。哦,从周日开始,我一直在尝试。我需要知道如何从数组声明内部链接该函数。我需要语法!我在谷歌搜索了几个小时。但是我不熟悉C#testCommand
,testCommand2
是一个接受字符串数组的函数吗?不。我想要一个静态数组,它有一个命令列表,然后指向这些命令的函数。因此,如果有人使用命令“TestCommand”,我只需从结构中调用“chandler”委托。这有意义吗?你的testf
定义是什么?呃,我不能给你一个赞成票,但这是解决方案!非常感谢你!好的,那太好了!我还有一个问题。当您使用commands.add(new MyCommand())向堆栈中添加新命令时,您如何设置该新命令中的值?更具体地说,如何引用要调用的函数?非常感谢您抽出时间!哦,等等,在这个例子中,每个函数都有一个新类,我只是简单地添加每个类(从公共接口ibotcommand继承到堆栈?每种类型的命令都是从ibotcommand
继承的新类。每个命令都有一个Process
方法,该方法接受参数列表。由于每个命令接口都是相同的,因此不必编写特殊代码来调用每个命令,即d本身解决了这个问题。呃,我不能给你一个投票,但这是解决方案!非常感谢!好的,太好了!我还有一个问题。当你用commands.add(new MyCommand())向堆栈添加新命令时您如何在新命令中设置值?更具体地说,您是如何引用要调用的函数的?非常感谢您的时间!哦,等等,在这个示例中,我是否为每个函数都有一个新类,并且我只是简单地添加了每个类(从公共接口ibotcommand继承到堆栈?每种类型的命令都是从ibotcommand
继承的新类。每个命令都有一个Process
方法,该方法接受参数列表。由于每个命令接口都是相同的,因此不必编写特殊代码来调用每个命令,即d本身负责解决这一问题。