C#委托数组声明中定义的函数?

C#委托数组声明中定义的函数?,c#,C#,我正在为我的流制作一个IRC聊天机器人。我发现了一些使用C#的基本连接示例,所以我决定尝试一下 到目前为止,我喜欢它 但我被这一部分困住了 我想将bot命令存储在结构类型的数组中 public delegate void cmdHandler(string[]); struct botCommand { string name; cmdHandler chandler; bool isAdmin = false; string help = "Nothing h

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

到目前为止,我喜欢它

但我被这一部分困住了

我想将bot命令存储在结构类型的数组中

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;
    }
逻辑步骤:

  • 用户输入测试命令
  • 循环所有命令,查看是否找到test命令
  • 找到测试命令
  • 调用与test命令关联的函数并传递参数(命令的其余部分)

  • 在我看来,您似乎将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本身负责解决这一问题。