我收到一个错误“非静态字段、方法或属性‘Excel1.Program.GetAllTemplateNames(string, string)’需要对象引用”我知道这很愚蠢,但我对 C# 很陌生,可以做在调试此代码时提供一些帮助。甚至可以从 Main 函数调用静态函数吗?我有这些疑问。
5 回答
由于是静态的,如果没有此类 () 的实例,则无法从那里ProcessInput
调用实例(非静态)方法。GetAllTemplateNames
Program
因此,您要么需要制作GetAllTemplateNames
静态,要么需要制作ProcessInput
非静态。我会选择第二个选项,因为GetAllTemplateNames
需要访问一些实例变量,这在静态时是不可能的。
ProcessInput
所以通过以下方式更改签名(注意省略static
):
public void ProcessInput(String strRetVal, String strFunctionName, /*String strParamCount,*/ String strParam1, String strParam2, String strParam3, String strParam4)
现在您还需要将此方法的调用更改main
为:
var p = new Program(); // create an instance
p.ProcessInput(strRetVal, strFunctionName, /*strParamCount,*/ strParam1, strParam2, strParam3, strParam4);
如果您希望能够在没有类实例的情况下从其他静态方法调用它,则应该创建该GetAllTemplateNames
方法:static
public static void GetAllTemplateNames(String strParam, String strRetVal)
这也意味着此方法使用的字段(templateClient
并且taskClient
也必须是静态的)
或者另一种可能性是创建包含类的实例:
new Program().GetAllTemplateNames(strParam1, strRetVal);
更改此行
GetAllTemplateNames(strParam1, strRetVal);
到
new Program().GetAllTemplateNames(strParam1, strRetVal);
或使方法静态。
问题发生在线路上,以及对或的GetAllTemplateNames(strParam1, strRetVal);
任何其他呼叫。GetAllTemplateNames()
ReturnAllTemplateNames()
这些方法不是静态的,但您是从静态方法调用它们!您需要将它们设为静态,或创建它们的包含类的实例,以便从静态方法(如main()
.
主要功能是静态的,这就是您可以调用 ProcessInput 的原因。但是,您不能从静态函数调用非静态函数:GetAllTemplateNames 必须是静态函数。