1

我正在为我的流制作一个 IRC 聊天机器人。我找到了一些使用 C# 的基本连接示例,因此我决定尝试一下。

到目前为止我喜欢它

但我被困在这一部分上。

我想将机器人命令存储在结构类型的数组中。

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;
    }

逻辑步骤:

  1. 用户输入测试命令
  2. 循环遍历所有 botCommands 看看我们是否找到了测试命令
  3. 找到测试命令
  4. 调用与测试命令关联的函数并传递一个参数(命令的其余部分)
4

1 回答 1

1

对我来说,您似乎将 C/C++ 概念与 C# 混合在一起(使用结构而不是类,0 表示假,对象初始化器等)。

要解决您的个人问题,您必须以不同的方式实例化您的结构。

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"
}
于 2013-07-21T23:13:55.553 回答