定义和使用委托数组

本文关键字:数组 定义 | 更新日期: 2023-09-27 18:35:42

哇,这在C或C++中是如此简单。我正在尝试用 C# 编写一个工具来解析编译的 C 代码(即汇编器输出),以便计算嵌入式系统应用程序中每个函数的堆栈使用情况。但这不是这里重要的。如何创建一个"函数指针"数组并遍历它们,调用它们指向的函数?

我已经尝试了大约 1000 种delegateDelegate以及Func和参数化构造函数的变化,但无法弄清楚如何摆脱 VS2013 编辑器中所有讨厌的红色波浪线:

  public struct Parser
  {
     public string platformName;
     public Delegate d_isThisPlatform;
     public Delegate d_parseAsm;
     public Parser(string platformName, Delegate isThisPlatform, Delegate parseAsm)
     {
        this.platformName = platformName;
        this.d_isThisPlatform = isThisPlatform;
        this.d_parseAsm = parseAsm;
     }
  };
  public static bool PIC32MX_GCC_isThisPlatform(string asmFileContents)
  {
     return false; // stub
  }
  public static bool PIC32MX_GCC_parseAsm(string asmFileContents)
  {
     return false; // stub
  }
  public static bool M16C_IAR_isThisPlatform(string asmFileContents)
  {
     return true; // stub
  }
  public static bool M16C_IAR_parseAsm(string asmFileContents)
  {
     return false; // stub
  }
  const Parser[] parsers =
  {
     new Parser("PIC32MX_GCC",     PIC32MX_GCC_isThisPlatform,    PIC32MX_GCC_parseAsm),
     new Parser("M16C_IAR",        M16C_IAR_isThisPlatform,       M16C_IAR_parseAsm)
  };
  public Parser findTheRightParser(string asmFileContents)
  {
     foreach(Parser parser in parsers)
     {
        if (parser.d_isThisPlatform(asmFileContents))
        {
           Console.WriteLine("Using parser: ", parser.platformName);
           return parser;
        }
     }
  }

我当前的错误(对于上面列出的代码)是" The best overloaded method match for 'staticAnalysis.Program.Parser.Parser(string,System.Delegate,System.Delegate)' has some invalid arguments. "我不相信使用 System.Delegate ;如果我能简单地使用delegate那将是我的偏好,但更重要的是,我对简单的东西感兴趣。

定义和使用委托数组

Delegate对于

您要做的事情来说太宽泛了。 您需要指定委托可以预期的输入以及它将生成的输出(如果有)。您可以将它们指定为接受字符串并返回布尔值的函数:

  public struct Parser
  {
     public string platformName;
     public Func<string, bool> d_isThisPlatform;
     public Func<string, bool> d_parseAsm;
     public Parser(string platformName,Func<string, bool> isThisPlatform, Func<string, bool> parseAsm)
     {
        this.platformName = platformName;
        this.d_isThisPlatform = isThisPlatform;
        this.d_parseAsm = parseAsm;
     }
  };

或者定义特定的委托类型并将字段和参数声明为该类型:

  public struct Parser
  {
     public delegate bool ParseDelegate(string content);
     public string platformName;
     public ParseDelegate d_isThisPlatform;
     public ParseDelegate d_parseAsm;
     public Parser(string platformName,ParseDelegate isThisPlatform, ParseDelegate parseAsm)
     {
        this.platformName = platformName;
        this.d_isThisPlatform = isThisPlatform;
        this.d_parseAsm = parseAsm;
     }
  };

修复此问题后,您最终会遇到另外两个编译器错误。 这些修复程序留给您的学习体验...