定义和使用委托数组
本文关键字:数组 定义 | 更新日期: 2023-09-27 18:35:42
哇,这在C或C++中是如此简单。我正在尝试用 C# 编写一个工具来解析编译的 C 代码(即汇编器输出),以便计算嵌入式系统应用程序中每个函数的堆栈使用情况。但这不是这里重要的。如何创建一个"函数指针"数组并遍历它们,调用它们指向的函数?
我已经尝试了大约 1000 种delegate
和Delegate
以及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;
}
};
修复此问题后,您最终会遇到另外两个编译器错误。 这些修复程序留给您的学习体验...